我希望使用pynsist打包一个Python3-PyGObject程序。该存储库有一个PyGTK示例,这让我认为更改示例不应该太难。
示例可以在此处找到: 在这个文件中 (https://github.com/takluyver/pynsist/blob/master/examples/pygtk/grab_files.sh),我认为只需要获取针对GTK 3的文件 (http://www.gtk.org/download/win32.php)。
我尝试自定义这个文件(https://github.com/takluyver/pynsist/blob/master/examples/pygtk/installer.cfg),以包含(使用
这个错误的原因是:
这个 ImportError 出现很奇怪,因为在与 __init__.py 同一目录(gi)中有一个 _gi.pyd 文件。
当前布局如下:
我使用了pygobject绑定的
示例可以在此处找到: 在这个文件中 (https://github.com/takluyver/pynsist/blob/master/examples/pygtk/grab_files.sh),我认为只需要获取针对GTK 3的文件 (http://www.gtk.org/download/win32.php)。
wget -O gtkbundle.zip http://win32builder.gnome.org/gtk+-bundle_3.6.4-20130921_win32.zip
wget -O pygobject.exe http://sourceforge.net/projects/pygobjectwin32/files/pygi-aio-3.14.0_rev12-setup.exe/download
wget -O pycairo.zip http://ftp.gnome.org/pub/gnome/binaries/win32/dependencies/cairo_1.10.2-2_win32.zip
我不确定如何处理第四行,因为我目前的理解是这些绑定应该已经包含在gtk或pygobject捆绑包中:
wget -O pygtk.exe http://ftp.gnome.org/pub/GNOME/binaries/win32/pygtk/2.24/pygtk-2.24.0.win32-py2.7.exe
我尝试自定义这个文件(https://github.com/takluyver/pynsist/blob/master/examples/pygtk/installer.cfg),以包含(使用
gi
而不是gi.repository
):[Include]
packages=gi
这个错误的原因是:
raise ExtensionModuleMismatch(extensionmod_errmsg % ('Windows', path))
nsist.copymodules.ExtensionModuleMismatch: Found an extension module that will not be usable on Windows:
/usr/lib/python3/dist-packages/gi/_gi.cpython-34m-x86_64-linux-gnu.so
Put Windows packages in pynsist_pkgs/ to avoid this.
有人知道像https://python-gtk-3-tutorial.readthedocs.org这样的程序在Windows上的正确方法吗?
编辑 1
在Windows上打包和安装程序后,启动测试程序会产生以下回溯:Traceback (most recent call last):
File "C:\Program Files (x86)\hellogtk\hellogtk.launch.pyw", line 31, in <module>
from gtk_test import main
File "C:\Program Files (x86)\hellogtk\pkgs\gtk_test.py", line 3, in <module>
from gi.repository import Gtk
File "C:\Program Files (x86)\hellogtk\pkgs\gi\__init__.py", line 42, in <module>
from . import _gi
ImportError: DLL load failed: The specified module could not be found.
这个 ImportError 出现很奇怪,因为在与 __init__.py 同一目录(gi)中有一个 _gi.pyd 文件。
当前布局如下:
- directory
|- pynsist_pkgs
|-- cairo
|--- _cairo.pyd
|--- __init__.py
|-- gi
|--- _gobject
|--- overrides
|--- repository
|--- __init__.py
|--- _gi.pyd
|--- ...
|-- gtk
|--- bin
|--- etc
|--- lib
|--- manifest
|--- share
|-- dbus
|--- __init__.py
|--- ...
|-- gnome
|--- ...
|-- pygtkcompat
|--- ...
|-- _dbus_bindings.pyd
|-- _dbus_glib_bindings.pyd
|-- ...
|- gtk_test.py
|- grab_files.sh
|- installer.cfg
|- gtk_preamble.py
我使用了pygobject绑定的
py-3.4-64
文件夹。我正在创建包的Linux是64位的,我运行程序的Windows也是64位的。
编辑2:
使用Dependency-Walker,我可以看到缺少两个DLL文件:GPSVC.DLL
和IESHIMS.DLL
。
编辑3:
我在系统中找到了这两个DLL文件,并将它们复制到测试程序的不同目录中,但没有起作用。
编辑4:
这可能对于导入错误有用:
./grab-files.sh
,它会把那些库的 Windows 版本放在pynsist_pkgs
中,这样它们就会被用来代替你的 Linux 库。我已经弄清楚了,可以使用7z
(在 Ubuntu 系统上使用apt-get install p7zip-full
)来解压缩 pygi 安装程序。这会在几个目录中解压出 1.5 GB 的文件!看起来你需要找出哪些部分是你需要的,然后进行第二轮解压缩以获取实际的文件。 - Thomas K%APPDATA%
中的日志文件中。在 Windows 7 系统上,通常是C:\Users\{username}\AppData\Roaming
。这应该有助于告诉您出了什么问题。或者您可以启动命令提示符,cd 到 Program Files 中安装目录并运行py MyApp.launch.pyw
。 - Thomas K