В: Python win32com: код не запускается после изменения библиотеки типов с помощью makepy.py

Я изучал модуль 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, но это не изменило ситуацию.

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


person slinden    schedule 05.06.2018    source источник


Ответы (1)


Основная причина этой ошибки атрибута заключается в том, что ваш 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"
person Bharat Sesham    schedule 23.08.2018
comment
Переход на верблюжий футляр сработал для меня. От ns.createRecipient () до ns.CreateRecipient (). Однако динамическое решение не помогло. - person MonkeySeeMonkeyDo; 12.06.2020