将 GTK+ 的bin 等、share 和 lib目录复制到项目的 dist 目录的标准答案是正确的(但我看到有人破坏了 [1] 并且
列表中缺少bin),毕竟:
- PyGTK 只不过是一层薄薄的胶水,使 Python 可以使用 GTK+
- PyGObject 只不过是一层薄薄的胶水,使 GObject、GIO、……可用于 Python
- PyCairo 只不过是一层薄薄的胶水,让 Python 可以使用 Cairo
至少,您需要所有 3 个绑定包,并且由于它们的性质,如果底层平台不可用(.dll 文件、配置文件,简而言之:整个 shebang),它们将毫无用处。这就是为什么需要将 GTK+ 的
bin 等、share 和 lib复制到项目的 dist 目录的原因。
然而,我几年前在 [1] 上发布的 setup.py 片段还不够完整。正确的版本应该是:
from distutils.core import setup
import py2exe
setup(
name = 'handytool',
description = 'Some handy tool',
version = '2.0',
zipfile = 'bin/library.zip',
windows = [{'script': 'handytool.py',
'dest_base': 'bin/handytool'}
],
options = {'py2exe': {'packages':'encodings',
'includes': 'glib, gio, gobject, cairo, atk, pango, pangocairo, gtk'}
}
)
记下zipfile和dest_base的值。使用这些选项,您的 .exe、一堆 .pyd 文件和 library.zip 都在 py2exe 的 dist/bin 目录中创建。然后,当您将 GTK+ 的目录复制到 py2exe 的 dist 目录时,您的可执行文件就在 libgtk-win32-2.0.0.dll 等旁边。如果您不执行上述操作,错误配置的 PATH 环境变量可能会干扰您的 py2exe 可执行文件加载的(有时不兼容的).dll 文件。
所以对于上面的 setup.py 文件,正确的 dist 目录结构应该是这样的:
bin/handytool.exe
bin/library.zip
bin/*.pyd (all .pyd files py2exe deemed needed)
bin/* (complete copy of GTK+ runtime bin dir)
etc/* (complete copy of GTK+ runtime etc dir)
share/* (complete copy of GTK+ runtime share dir)
lib/* (complete copy of GTK+ runtime lib dir)
当您使上述工作正常时,您会发现加载图像就可以了,您可以开始考虑省略 share/ 的某些部分(例如您不需要/不需要的翻译文件)等。
mvg, 迪特
[1] http://www.py2exe.org/index.cgi/Py2exeAndPyGTK
编辑 2011/07/05:修复了 PyGObject 2.28/PyGTK 2.24 的包含选项。如果您只使用 PyGObject 2.28,则包含选项必须包含“glib、gio、gobject”。如果您使用的是 PyGTK,那么它需要:'glib、gio、gobject、cairo、atk、pango、pangocairo、gtk'。