2012-07-24 4 views
4

저는 python 용으로 win32com을 배우고 있습니다. 이상한 문제가 있습니다.win32com.client.Dispatch는 작동하지만 win32com.client.gencache.EnsureDispatch가 아닙니다.

사전의 목록에서 Outlook 연락처를 내보내려고합니다. 내 코드는 win32com.client.Dispatch ("Outlook.Application)와 완벽하게 작동하지만 더 빠르고 안전한"win32com.client.gencache.EnsureDispatch ("Outlook.Application)"로 0 개의 연락처를 반환합니다. 내가 교체 할 때 그래서

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가 더 이상 작동하지 않는다는 것입니다. 난 내가 해결책을 발견 Outlook과 Python2.7.3 64 비트 2007 32 비트

감사

+0

장점과 초기 바인딩의 단점을 무엇입니까 (EnsureDispatch) 및 후기 바인딩 (Disaptch)? 이 코드를 계속 유지하면 (많은 플랫폼에서 실행됩니다.) 괜찮습니까? – franckgaga

+0

'Temp \ gen_py' 폴더에 캐시를 생성했기 때문에 IMO'win32com.client.Dispatch'가 작동하지 않았습니다 – Winand

답변

3

를 실행 해요

... pywin32를 제거하고 다시 설치해야합니다. 그것은 큰 문제가 contact.itemProperties 또 다른 문제가 있습니다

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] 
    ... 

(파이썬 0 기반 인덱스 반대) Outlook을 olContactItem에 대한 인덱스 1부터 시작된다는 점이다 버그 win32com makepy ...

입니다. 모든 속성 때문에, 경우 EnsureDispatch에 민감하다 :

contact.ItemProperties("FullName").Value 
#  ^

작품,하지만 :

contact.itemProperties("FullName").Value 
#  ^

바로 이름을 얻으려면 문의 : Word Object Model Reference on MSDN