pyinstaller и win32com

Поэтому я не понимаю, как заставить pyinstaller создать приложение, использующее win32com. У меня есть скрипт, который без проблем запускается из IDLE или командной строки, который взаимодействует с excel через

xl = Dispatch('Excel.Application')

затем следуют некоторые другие действительно простые вызовы Excel, а затем закрывается. Я видел совет включать «clsctx=pythoncom.CLSCTX_LOCAL_SERVER» в качестве аргумента Dispatch, но это ничего не меняет. Всякий раз, когда я создаю скрипт, я получаю сообщение об ошибке, подобное этому

Traceback (most recent call last):
File "<string>", line 7, in <module>
File "C:\Python27\trunk\iu.py", line 436, in importHook
mod = _self_doimport(nm, ctx, fqname)
File "C:\Python27\trunk\iu.py", line 521, in doimport
exec co in mod.__dict__
File "Myskript\build\pyi.win32\Myskript\outPYZ1.pyz/win32com.client", line 11,
in <module>
File "C:\Python27\trunk\iu.py", line 436, in importHook
mod = _self_doimport(nm, ctx, fqname)
File "C:\Python27\trunk\iu.py", line 521, in doimport
exec co in mod.__dict__
File "Myskript\build\pyi.win32\Myskript\outPYZ1.pyz/win32com.client.gencache",
line 662, in <module>
File "Myskript\build\pyi.win32\Myskript\outPYZ1.pyz/win32com.client.gencache",
line 58, in __init__
File "Myskript\build\pyi.win32\Myskript\outPYZ1.pyz/win32com.client.gencache",
line 649, in Rebuild
File "Myskript\build\pyi.win32\Myskript\outPYZ1.pyz/win32com.client.gencache",
line 65, in _SaveDicts
File "Myskript\build\pyi.win32\Myskript\outPYZ1.pyz/win32com.client.gencache",
line 141, in GetGeneratePath
IOError: [Errno 22] invalid mode ('w') or filename: 'C:\\Python27\\trunk\\Myskri
pt\\dist\\Myskript.exe?844863\\__init__.py'

Это скопировано из этого немецкого вопроса http://www.python-forum.de/viewtopic.php?f=1&t=25010, но моя ошибка в основном такая же. Я пытался реализовать совет, данный на этой странице, но безрезультатно.

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

РЕДАКТИРОВАТЬ: Также попытался импортировать pythoncom и запустить «CoInitialize()» (на основе этого парня Вызвать функцию модуля MS Access из Python после сбоя компиляции с помощью py2exe, заявив, что его скрипт работал нормально с pyinstaller), но это тоже ничего не изменило. На самом деле в недоумении здесь и ценю любые советы.


person eric p    schedule 24.07.2012    source источник
comment
ОК, если кому-то это нужно, я решил это, удалив папку «gens» из Python/Lib/site-packages/win32com/, а затем предварив вызов Dispatch следующим образом: win32com.client.gencache.is_readonly=False win32com.client.gencache.GetGeneratePath() pythoncom.CoInitialize() xl = Dispatch('Excel.Application', clsctx = pythoncom.CLSCTX_LOCAL_SERVER)   -  person eric p    schedule 25.07.2012


Ответы (1)


Я не уверен, что вы все еще используете py2exe, я собирался попробовать ваш обходной путь, когда наткнулся на эту тему: Вызов функции модуля MS Access из Python после сбоя компиляции с py2exe

«Решение» заключалось в использовании Pyinstaller, в котором по умолчанию реализовано множество обходных путей в зависимости от вашего сценария. Я попробовал это с моим скриптом pywin32, который использует объекты excel и word com, и он отлично работал без каких-либо настроек.

person mlabarca    schedule 23.06.2013