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

4 投票
3 回答
3174 浏览
提问于 2025-04-16 14:13

我正在尝试使用Py2Exe构建我的第一个应用程序,按照这个链接上的说明进行,唯一的不同是我用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模块添加到setup.py的“includes”选项中,似乎没有任何效果。

进一步调查后,我用Dependency Walker打开了生成的exe,它显示有两个dll文件缺失,分别是MPR.DLL和SHLWAPI.DLL,但这两个文件都在我的system32文件夹里。

如果我不使用glade直接创建用户界面,就没有任何问题,但考虑到我已经用glade创建了另一个应用程序,我希望尽可能继续使用glade。请问接下来该怎么做?我在Windows XP上使用Python 2.7、Py2Exe 0.6.9和PyGtk 2.22.6。

谢谢,
Brent

3 个回答

0

我之前也遇到过同样的错误,不过我解决了。当你运行 setup.py py2exe 的时候,你的文件会在 win32 目录下生成,pyo 文件名会变成 glade.pyo。然后你可能会觉得在 win64 .pyc 里也会有类似的情况,至少这是我遇到的情况。我在 window7-64 上运行 py2exe 时遇到了这个错误,但当我在 win32 上创建可执行文件时,我觉得生成了 glade.pyo,然后又出现了同样的错误。于是我去我的项目里做了一些调整。

gtk.Builder()

我不再使用这个了。

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

而且我把我 .py 文件里的 gtk.glade 导入语句删掉了,在我的 setup.py 里只保留了:

import gtk

这样一来,一切都正常工作了。希望我的经验能对你有所帮助。

1

这可能对你没什么帮助,但我之前也遇到过同样的问题,结果发现是gtk安装出了问题。这导致了py2exe生成的gtk._gtk.pyd文件出现了问题。

我使用的setup.py几乎和py2exe在http://www.py2exe.org/index.cgi/Py2exeAndPyGTK上建议的那个一样。

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 !!!分享就是关心!!!

撰写回答