使用Py2Exe、PyGtk和Glade时缺少dll文件

4
我正在尝试使用Py2Exe构建我的第一个应用程序,并按照http://www.py2exe.org/index.cgi/Py2exeAndPyGTK中列出的说明进行操作,但我使用Glade创建UI。(它只是一个非常简单的带有关闭按钮和标签的GUI。)
当我尝试运行生成的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模块手动添加到setyp.py中的“includes”选项中,它没有任何效果。
进一步挖掘后,我使用Dependency Walker打开生成的exe文件,它告诉我有两个dll文件缺失,MPR.DLL和SHLWAPI.DLL,但这两个文件都在我的system32文件夹中。
如果我只是创建UI而不使用glade,我就没有任何问题,但考虑到我已经用glade创建了另一个应用程序,如果可能的话,我想坚持使用glade。您对接下来该怎么做有什么建议吗?我在Windows XP上使用Python 2.7、Py2Exe 0.6.9、PyGtk 2.22.6。
谢谢, Brent
3个回答

5
我也遇到了同样的问题,但是在谷歌上花了几个小时后,我找到了解决方法。
  1. 使用Dependency Walker和分析你的xxx.exe文件。你可以从http://www.dependencywalker.com/下载它。
  2. 找出错误文件(对我的情况来说,它们是MSJAVA.DLL和libxml2-2.dll)
  3. 搜索你电脑上的目录并将它们复制到“dist”文件夹中。你也可以从其他网站下载缺失的DLL文件。
  4. 再次运行Dependency Walker,你会看到错误减少或消失了。
  5. 现在xxx.exe可以执行了。
希望以上内容能帮助那些遇到类似问题的人。
Neoh !!!分享就是关爱!!!

在dist文件夹中添加libxml2-2.dll,这对我有用。奇怪的是,它在没有MSJAVA.DLL的情况下也可以正常运行。 - ashastral
对于依赖项检查器的建议点赞,但是对我来说,不是将dll添加到dist文件夹中,而是将树形结构中出现错误的dll的父级dll添加到setup.py选项中的“dll_excludes”中,这样应用程序就可以正常工作了(我添加了'MSWSOCK.dll'、'MSHTML.dll'和'DNSAPI.dll')。 - William Ardila

1
这可能不会有帮助,但我遇到了同样的问题,结果发现是gtk安装问题导致的。这导致了py2exe生成的gtk._gtk.pyd文件出现问题。
我使用的setup.py基本上与py2exe在http://www.py2exe.org/index.cgi/Py2exeAndPyGTK上建议的相同。

0

我曾经遇到过同样的错误并进行了修复。当你运行setup.py py2exe时,你的文件会被创建在win32中。pyo作为glade.py的o文件,而当你在win64 .pyc上运行时,至少这是我的经验,它运行了py2exe我的app in window7-64,然后给了我这个错误,但是当你在win32上创建可执行文件时,我认为使用glade.pyo,然后给了我相同的错误,去我的项目里做所有的事情。

gtk.Builder()

`不要再使用更多了

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

将我的 .py 文件和我的 setup.py 中的 gtk.glade 导入去掉,只使用以下导入即可:

import gtk

一切都工作得非常完美。 希望我的经验对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接