win32com.client.Dispatch работает, но не win32com.client.gencache.EnsureDispatch

Я изучаю win32com для python, и у меня есть странная проблема.

Я пытаюсь экспортировать контакты Outlook в список Dictionnary. Мой код отлично работает с win32com.client.Dispatch («Outlook.Application»), но он возвращает 0 контактов с win32com.client.gencache.EnsureDispatch («Outlook.Application»), который должен быть быстрее и «безопаснее». Вот мой код:

class MapiImport(): def __init__(self): self.olApp = win32com.client.Dispatch("Outlook.Application") self.namespace = self.olApp.GetNamespace(u"MAPI") # olFolderContacts = 10 : self.mapiContacts = self.namespace.GetDefaultFolder(10).Items def getContacts(self, *fields): contacts = [] # Class == 40 is ContactItem # Class == 69 is DistListItem # Exclude ditribution list and others objects != ContactItem for contact in filter(lambda x: x.Class == 40,self.mapiContacts) : if not fields : ctact = dict((x.Name,x.Value) for x in contact.ItemProperties) else : ctact = {} for field in fields : itemProp = contact.itemProperties[field] ctact[field] = itemProp.Value contacts.append(ctact) return contacts #====TEST SCRIPT==== myMAPI = MapiImport() fields = (u"LastName",u"FirstName",u"Companies", u"HomeTelephoneNumber",u"Home2TelephoneNumber", u"MobileTelephoneNumber", u"BusinessTelephoneNumber",u"Business2TelephoneNumber", u"Email1Address",u"Email2Address",u"Email3Address", u"HomeAddress",u"BusinessAddress", u"Birthday",u"Anniversary", u"Body") print(myMAPI.getContacts(*fields)) 

Поэтому, когда я заменяю:

 olApp = win32com.client.Dispatch("Outlook.Application") 

С :

 olApp = win32com.client.gencache.EnsureDispatch("Outlook.Application") 

Он возвращает эти ошибки:

 Traceback (most recent call last): File "D:\Documents and Settings\da7950\Mes documents\Dropbox\cheetahImporter\mapiImport.py", line 42, in <module> print(myMAPI.getContacts(*fields)) File "D:\Documents and Settings\da7950\Mes documents\Dropbox\cheetahImporter\mapiImport.py", line 19, in getContacts for contact in filter(lambda x: x.Class == 40,self.mapiContacts) : File "D:\Documents and Settings\da7950\Mes documents\Python27\lib\site-packages\win32com\gen_py\00062FFF-0000-0000-C000-000000000046x0x9x2\_Items.py", line 122, in __getitem__ return self._get_good_object_(self._oleobj_.Invoke(*(81, LCID, 1, 1, item)), "Item") com_error: (-2147352567, "Une exception s'est produite.", (4096, u'Microsoft Office Outlook', u'Index de la matrice en dehors des limites.', None, 0, -2147352567), None) 

Сообщение означает «Матричный индекс за пределами границ». Самое странное, что после того, как я позвонил в EnsureDispatch, win32com.client.Dispatch больше не работает. Я должен удалить pywin32 и переустановить его …

Я работаю с Python2.7.3 64-разрядным с 32-разрядным Outlook 2007

благодаря

  • есть ли хороший пример использования pywin32 createprocessasuser и получения результата?
  • dll загружает ошибки в исполняемом файле python из pywin32
  • Загрузите надстройку Excel с помощью win32com из Python
  • Python - создание ярлыка с аргументами
  • Ошибка «Вызываемый объект отключен от своих клиентов» - автоматизировать IE 8 с помощью python и win32com
  • Python: обновить сводные таблицы на рабочем листе
  • «Не реализовано» Исключение при использовании pywin32 для управления Adobe Acrobat
  • Асинхронные данные через новый API данных Bloomberg (COM v3) с Python?
  • One Solution collect form web for “win32com.client.Dispatch работает, но не win32com.client.gencache.EnsureDispatch”

    Я нашел решение. Это ошибка win32com makepy …

    Основная проблема заключается в том, что Outlook индексируется на основе 1 для olContactItem (в oppsition до 0-основанного индекса для python)

     olApp = win32com.client.gencache.EnsureDispatch("Outlook.Application") namespace = olApp.GetNamespace(u"MAPI") # olFolderContacts = 10 : mapiContacts = namespace.GetDefaultFolder(10).Items for i in range(1,len(mapiContacts)+1) : contact = self.mapiContacts[i] ... 

    Существует еще одна проблема с contact.itemProperties. Все свойства чувствительны к регистру с помощью программы EnsureDispatch, поэтому:

     contact.ItemProperties("FullName").Value 

    работает, но нет:

     contact.itemProperties("FullName").Value 

    ¸ ref для имен свойств: MSDN

    Python - лучший язык программирования в мире.