Отсутствуют библиотеки DLL при использовании Py2Exe, PyGtk и Glade

Я пытаюсь создать свое первое приложение с использованием Py2Exe и следую инструкциям, приведенным на странице http://www.py2exe.org/index.cgi/Py2exeAndPyGTK, за исключением того, что я создаю пользовательский интерфейс с помощью Glade. (Это просто очень минимальный графический интерфейс с кнопкой закрытия и меткой.)

Когда я пытаюсь запустить полученный exe, я получаю диалоговое окно с просьбой проверить файл журнала, который содержит следующее сообщение об ошибке:

Traceback (most recent call last):
  File "pygtkpy2exetest.py", line 8, in <module>
  File "gtk\glade.pyc", line 12, in <module>
  File "gtk\glade.pyc", line 10, in __load
ImportError: DLL load failed: The specified module could not be found.

Итак, я начал немного копаться, первое, что я заметил, это то, что похоже, что py2exe не может найти модули glib:

The following modules appear to be missing
['gdk', 'unix', 'glib.GError', 'glib.IOChannel', 'glib.IO_ERR', 'glib.IO_FLAG_APPEND', 'glib.IO_FLAG_GET_MASK', 'glib.IO_FLAG_IS_READABLE', 'glib.IO_FLAG_IS_SEEKABLE', 'glib.IO_FLAG_IS_WRITEABLE', 'glib.IO_FLAG_MASK', 'glib.IO_FLAG_NONBLOCK', 'glib.IO_FLAG_SET_MASK', 'glib.IO_HUP', 'glib.IO_IN', 'glib.IO_NVAL', 'glib.IO_OUT', 'glib.IO_PRI', 'glib.IO_STATUS_AGAIN', 'glib.IO_STATUS_EOF', 'glib.IO_STATUS_ERROR', 'glib.IO_STATUS_NORMAL', 'glib.Idle', 'glib.MainContext', 'glib.MainLoop', 'glib.OPTION_ERROR', 'glib.OPTION_ERROR_BAD_VALUE', 'glib.OPTION_ERROR_FAILED', 'glib.OPTION_ERROR_UNKNOWN_OPTION', 'glib.OPTION_FLAG_FILENAME', 'glib.OPTION_FLAG_HIDDEN', 'glib.OPTION_FLAG_IN_MAIN', 'glib.OPTION_FLAG_NOALIAS', 'glib.OPTION_FLAG_NO_ARG', 'glib.OPTION_FLAG_OPTIONAL_ARG', 'glib.OPTION_FLAG_REVERSE', 'glib.OPTION_REMAINING', 'glib.OptionContext', 'glib.OptionGroup', 'glib.PRIORITY_DEFAULT', 'glib.PRIORITY_DEFAULT_IDLE', 'glib.PRIORITY_HIGH', 'glib.PRIORITY_HIGH_IDLE', 'glib.PRIORITY_LOW', 'glib.Pid', 'glib.PollFD', 'glib.SPAWN_CHILD_INHERITS_STDIN', 'glib.SPAWN_DO_NOT_REAP_CHILD', 'glib.SPAWN_FILE_AND_ARGV_ZERO', 'glib.SPAWN_LEAVE_DESCRIPTORS_OPEN', 'glib.SPAWN_SEARCH_PATH', 'glib.SPAWN_STDERR_TO_DEV_NULL', 'glib.SPAWN_STDOUT_TO_DEV_NULL', 'glib.Source', 'glib.Timeout', 'glib.child_watch_add', 'glib.filename_display_basename', 'glib.filename_display_name', 'glib.filename_from_utf8', 'glib.get_application_name', 'glib.get_current_time', 'glib.get_prgname', 'glib.glib_version', 'glib.idle_add', 'glib.io_add_watch', 'glib.main_context_default', 'glib.main_depth', 'glib.markup_escape_text', 'glib.set_application_name', 'glib.set_prgname', 'glib.source_remove', 'glib.spawn_async', 'glib.timeout_add', 'glib.timeout_add_seconds', 'glib.uri_list_extract_uris']

Если я попытаюсь вручную добавить модуль glib в параметр «includes» в setyp.py, это не даст никакого эффекта.

Копнув дальше, я открыл получившийся exe с помощью Dependency Walker, он показывает мне, что отсутствуют две библиотеки DLL, MPR.DLL и SHLWAPI.DLL, но обе они находятся в моей папке system32.

Если я просто создам пользовательский интерфейс без glade, у меня не возникнет никаких проблем, но, учитывая, что я уже создал другое приложение с glade, я бы хотел по возможности придерживаться glade. Есть предложения, что делать дальше? Я использую Python 2.7, Py2Exe 0.6.9, PyGtk 2.22.6 в Windows XP.

Спасибо, Брент


person Brent Miller    schedule 22.03.2011    source источник


Ответы (3)


У меня такая же проблема, но, проведя несколько часов в Google, мне удалось найти решение.

  1. использовать dependencywalker и профилировать ur xxx.exe u можно загрузить с http://www.dependencywalker.com/
  2. узнать файл с ошибкой (в моем случае это MSJAVA.DLL и libxml2-2.dll)
  3. найдите каталог ur pc и скопируйте их в папку dist. Вы также можете скачать недостающую DLL с другого сайта.
  4. снова запустите dependencywalker, вы увидите, что ошибка уменьшилась или больше не исчезла.
  5. xxx.exe теперь является исполняемым.

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

Неох !!! поделись заботой !!!

person user783736    schedule 04.06.2011
comment
+1 за libxml2-2.dll; добавление этого в папку dist сработало для меня. Как ни странно, без MSJAVA.DLL он работает нормально. - person ashastral; 10.07.2013
comment
+1 для обходчика зависимостей, но для меня вместо добавления dll в папку dist, добавление родительской dll той с ошибкой из дерева к dll_excludes параметра в setup.py заставляет приложение работать (я добавлены файлы MSWSOCK.dll, MSHTML.dll и DNSAPI.dll) - person William Ardila; 04.04.2018

Это может не помочь, но у меня была такая же проблема, и это оказалась проблема с установкой gtk. Это вызвало проблемы с файлом gtk._gtk.pyd, созданным py2exe.

Я использовал setup.py почти таким же, как тот, который предлагает py2exe на http://www.py2exe.org/index.cgi/Py2exeAndPyGTK

person BenIhle    schedule 08.06.2011

Однажды у меня была такая же ошибка, и я ее исправил. когда вы запускаете setup.py py2exe, ваши файлы создаются в win32. pyo как glade.pyo, и когда вы верите в win64 .pyc, по крайней мере, это то, что я испытывал, когда запускал py2exe мой app in window7-64, а затем выдавал мне ошибку, но когда вы создаете исполняемый файл на win32, я это сделал, я думаю, что glade.pyo, тогда дал мне ту же ошибку, перейдите в мой проект и выполните все действия с

gtk.Builder ()

`не использовать больше

gtk.glade.XML ("file.glade")

и удалите импорт gtk.glade моих файлов .py, а мой setup.py просто используйте

импортировать gtk

и все работало отлично. Надеюсь, мой опыт будет вам полезен.

person Maykel Llanes Garcia    schedule 06.03.2013