Q: Python win32com: код не запускается после изменения библиотеки типов с помощью makepy.py - PullRequest
0 голосов
/ 05 июня 2018

Я изучал модуль win32com.client и написал небольшой скрипт, который загружает все PDF-вложения из папки «Входящие» в Outlook на диск 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'

Есть ли возможность отменить изменения, внесенные при импорте библиотеки типов? Я попытался удалить / установить pywin32 с pip3, но это не изменило ситуацию.

IЯ использую Windows 10.

1 Ответ

0 голосов
/ 23 августа 2018

Основная причина этой ошибки атрибута заключается в том, что ваш 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"
...