问:Python win32com:使用makepy.py更改类型库后代码无法运行

时间:2018-06-05 07:48:52

标签: python outlook pywin32 win32com typelib

我正在研究win32com.client模块并制作了一个小脚本,可以将我的Outlook收件箱中的所有pdf附件下载到C盘。这是我的代码:

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)
messages = inbox.Items
ext = 'jpg'
for message in messages:
    attachments = message.attachments

    for attachment in attachments:
        if attachment.filename[-3:] == ext:
            attachment.SaveASFile("C:/PDF/" + attachment.filename)
            print(attachment.filename)

然后我浏览了makepy.py类型库并导入了" Microsoft Outlook 15.0对象库(9.5),我的代码不再有效了。我得到的错误如下:

AttributeError: '<win32com.gen_py.Microsoft Outlook 15.0 Object Library._MailItem instance at 0x58180464>' object has no attribute 'attachments'

是否有撤消导入类型库时所做的更改?我尝试用pip3卸载/安装pywin32,但它不会改变情况。

我正在运行Windows 10。

1 个答案:

答案 0 :(得分:0)

此属性错误的主要原因是因为您的COM服务器已从后期绑定(动态)更改为早期绑定(静态)。

  • 在后期绑定中,每当调用一个方法时,都会向该对象查询该方法,如果成功,则可以进行调用。
  • 在“早期绑定”中,对象模型的信息是根据对象调用提供的类型信息预先确定的。早期绑定使用MakePy。同样,早期绑定也区分大小写。

有两种方法可以解决此问题:

  1. 使用动态模块来强制您的代码以面向后期的方式工作。使用示例:

    "win32com.client.dynamic.Dispatch()" instead of "win32com.client.Dispatch()" 
    
  2. 使用面向驼峰的敏感关键字作为面向早期绑定的方式。使用示例:

    "excel.Visible()" instead of "excel.VISIBLE()" or "excel.visible()"
    

在您的情况下使用:

"message.Attachments" instead of "message.attachments"

此外,更改:

"attachment.SaveAsFile" instead of "attachment.SaveASFile"