Проблемы с запуском приложения, созданного с помощью PyInstaller, импортом GTK — поиском в несуществующих каталогах

Я пытаюсь создать исполняемый файл моего приложения Python, который использует PyGTK для создания графического интерфейса. У меня есть хорошо зарекомендовавший себя автоматизированный процесс сборки с использованием Pyinstaller, который работал у меня для предыдущего приложения. Достаточно сказать, что он вызывает обычные Makespec.py и Build.py с 32-битным Python 2.7, а Pyinstaller настроен на 32-битные. Полученное 32-разрядное приложение отлично работает на моем компьютере и другом компьютере с 64-разрядной версией Windows 7, но на 32-разрядной версии Windows XP происходит сбой с этой ошибкой:

C:\OutNav_0_64\OutNav_0.64>outnav
Traceback (most recent call last):
  File "<string>", line 23, in <module>
  File "C:\Pyinstaller-1.5\iu.py", line 436, in importHook
  File "C:\Pyinstaller-1.5\iu.py", line 521, in doimport
  File "C:\Users\462974\Documents\Local Sandbox\tools\utilities\Oni\build\pyi.win32\OutNav\outPYZ1.pyz/gtk", line 40, in
 <module>
  File "C:\Pyinstaller-1.5\iu.py", line 477, in importHook
  File "C:\Pyinstaller-1.5\iu.py", line 495, in doimport
  File "C:\Pyinstaller-1.5\iu.py", line 297, in getmod
  File "C:\Pyinstaller-1.5\archive.py", line 468, in getmod
  File "C:\Pyinstaller-1.5\iu.py", line 109, in getmod
ImportError: DLL load failed: The specified procedure could not be found.

Странно то, что на моей машине нет каталога C:\Pyinstaller-1.5 или того, в котором возникла ошибка. Я понятия не имею, почему он пытается запустить код из этого несуществующего каталога или что такое отсутствующая DLL. Может ли кто-нибудь помочь мне свернуть PyGTK в мое приложение?

ПРИМЕЧАНИЕ. Первая строка трассировки, строка 23 в моей программе,

import gtk

ОБНОВЛЕНИЕ: Мой менеджер успешно запустил его на 64-битной Windows XP. ОБНОВЛЕНИЕ 2: Он ошибся, это была 64-битная Windows 7. Та же проблема с его установкой Windows XP.

Кроме того, на исходной машине это не удалось, из каталога исполняемого файла я сделал это:

>>> import imp
>>> fp = open('gtk._gtk.pyd', 'rb')
>>> mod = imp.load_module('gtk._gtk', fp, 'gtk._gtk.pyd', ('.pyd', 'rb', 3))

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: DLL load failed: A dynamic link library (DLL) initialization routine failed.

person dpitch40    schedule 13.07.2012    source источник
comment
Какую версию pyinstaller вы используете? Исполняемый файл построен как один файл или один каталог?   -  person Luke Woodward    schedule 13.07.2012
comment
Я использую pyinstaller 1.5.1; он построен как единый каталог.   -  person dpitch40    schedule 13.07.2012
comment
Я реконструировал вызов в iu.py, вызывающий ошибку ImportError: mod = imp.load_module('gtk._gtk', fileobj, ..\\path\\to\\gtk._gtk.pyd, ('.pyd', 'рб', 3))   -  person dpitch40    schedule 13.07.2012
comment
Упоминается ли файл gtk._gtk.pyd в папке dist, созданной PyInstaller? Кроме того, поможет ли это, если вы создадите приложение для Windows XP? pyinstaller.org/ticket/324 выглядит примерно так же.   -  person Luke Woodward    schedule 13.07.2012
comment
gtk._gtk.pyd находится в том же каталоге, что и исполняемый файл. У меня нет собственной машины с XP, поэтому собрать ее на XP будет сложно.   -  person dpitch40    schedule 13.07.2012
comment
Если вы используете Windows 7 Pro, Ultimate или Enterprise, вы можете использовать режим Windows XP. Между прочим, stackoverflow.com/questions/159846 может быть вопросом Java, но ответ @matt описывает один случай, когда вы можете получить The specified procedure could not be found ошибка.   -  person Luke Woodward    schedule 13.07.2012
comment
Какие другие библиотеки DLL включены в ваше приложение? Если вы используете pyinstaller 1.5.1, знаете ли вы, что он может неправильно копировать системные библиотеки DLL (по моему опыту, kernel32.dll, kernelbase.dll и gdiplus.dll) в папку dist? Если в папке dist вашего приложения есть некоторые из этих DLL, поможет ли их удаление?   -  person Luke Woodward    schedule 13.07.2012
comment
У меня нет ни одного из них в каталоге установки. См. мое обновление выше: на самом деле оно не работает ни на одной машине с XP, которую я пробовал, и я получил аналогичную ошибку при воссоздании сбойной команды из интерпретатора. В настоящее время я предполагаю, что файл gtk._gtk.pyd, созданный Pyinstaller, каким-то образом несовместим с Windows XP.   -  person dpitch40    schedule 14.07.2012
comment
Извините, боюсь, у меня закончились идеи. В данный момент у меня нет доступа к компьютеру с Windows XP (у меня W7 Home Premium), поэтому я не могу воспроизвести вашу проблему.   -  person Luke Woodward    schedule 14.07.2012
comment
Да, мой обходной путь состоял в том, чтобы просто получить удаленный доступ к компьютеру с XP и построить его там, что, похоже, работает нормально.   -  person dpitch40    schedule 17.07.2012


Ответы (1)


Насколько я могу судить, файл .pyd (в формате файла .DLL), сгенерированный pyinstaller в Windows 7, несовместим с Windows XP. Мое решение состояло в том, чтобы просто воссоздать мой процесс сборки на компьютере с Windows XP, который решил его к моему удовлетворению.

person dpitch40    schedule 19.07.2012