Модель python-win32com excel com начала генерировать ошибки - PullRequest
0 голосов
/ 19 октября 2018

В течение последних нескольких дней я работал над автоматизацией генерации некоторых сводных таблиц для ряда отчетов.

Если свести к минимуму, следующий код работал без проблем:

import win32com.client    
objExcelApp = win32com.client.gencache.EnsureDispatch('Excel.Application')
objExcelApp.Visible = 1

Это выскочит экземпляр Excel, и я смогу продолжить работу в Python.Но внезапно, сегодня мои скрипты перестают работать со следующим:

>>>import win32com.client
>>> objExcelApp = win32com.client.gencache.EnsureDispatch('Excel.Application')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\win32com\client\gencache.py", line 534, in EnsureDispatch
    mod = EnsureModule(tla[0], tla[1], tla[3], tla[4], bForDemand=bForDemand)
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\win32com\client\gencache.py", line 391, in EnsureModule
    module = GetModuleForTypelib(typelibCLSID, lcid, major, minor)
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\win32com\client\gencache.py", line 266, in GetModuleForTypelib
    AddModuleToCache(typelibCLSID, lcid, major, minor)
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\win32com\client\gencache.py", line 552, in AddModuleToCache
    dict = mod.CLSIDToClassMap
AttributeError: module 'win32com.gen_py.00020813-0000-0000-C000-000000000046x0x1x9' has no attribute 'CLSIDToClassMap'

Код не изменился со вчерашнего дня до сегодняшнего дня.Понятия не имею, что происходит !!!.

Еще один интересный кикер.если я делаю тот же код в том же сеансе снова, я получаю другую ошибку:

>>> objExcelApp = win32com.client.gencache.EnsureDispatch('Excel.Application')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\win32com\client\gencache.py", line 534, in EnsureDispatch
    mod = EnsureModule(tla[0], tla[1], tla[3], tla[4], bForDemand=bForDemand)
  File "C:\Program Files (x86)\Python37-32\lib\site-packages\win32com\client\gencache.py", line 447, in EnsureModule
    if module.MinorVersion != tlbAttributes[4] or genpy.makepy_version != module.makepy_version:
AttributeError: module 'win32com.gen_py.00020813-0000-0000-C000-000000000046x0x1x9' has no attribute 'MinorVersion'
>>>

Поэтому я перехожу на компьютер с Windows с новой установкой Windows, устанавливаю python37 и pip install pypiwin32.Запустите те же строки и откройте Excel так же, как это было вчера на моей оригинальной машине.

Я попытался удалить и переустановить безуспешно.Есть идеи, что здесь происходит?

ПРИМЕЧАНИЕ. Динамическая диспетчеризация все еще работает:

import win32com.client
objExcelApp = win32com.client.Dispatch("Excel.Application")
objExcelApp.Visible = 1

Но мне особенно нужна статическая диспетчеризация, так как сводные таблицы не будут работать с динамически отправляемым объектом (оченьпозже в моем коде):

objExcelPivotCache = objExcelWorkbook.PivotCaches().Create(SourceType=win32c.xlDatabase, SourceData=objExcelPivotSourceRange)

1 Ответ

0 голосов
/ 29 января 2019

У меня была та же проблема, и я решил ее, следуя приведенным ниже инструкциям: https://mail.python.org/pipermail/python-win32/2007-August/006147.html

Удаление каталога вывода gen_py и повторный запуск makepy SUCCEEDS, после чего тестовое приложение снова запускается OK.

Таким образом, симптом устранен, но есть какие-то подсказки относительно того, как это могло произойти.Это ОЧЕНЬ долго работающее приложение (подумайте 24x7 в течение многих лет), и я обеспокоен тем, что все, что вызвало это, может произойти снова.

Чтобы найти выходной каталог, запустите его в вашей консоли python console / python:

import win32com
print(win32com.__gen_path__)

Исходя из сообщения об исключении в вашем сообщении, каталог, который необходимо удалить, будет называться '00020813-0000-0000-C000-000000000046x0x1x9'.Поэтому удалите этот каталог и повторите код.И если вы нервничаете из-за того, что удалили его (как я), просто обрежьте каталог и вставьте его в другое место.

Я понятия не имею, почему это происходит, и я не знаю, как предотвратить его повторение, ноуказания в приведенной мною ссылке, похоже, работают для меня.

...