- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想用 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 ):
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
我不确定如何处理第四行,因为我目前的理解是这些绑定(bind)应该已经在 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 上打包和安装程序后,启动测试程序会产生以下回溯:
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 的发生是因为有一个 _gi.pyd
-与 gi
位于同一目录 ( __init__.py
) 中的文件
这是当前布局:
- 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
我用了py-3.4-64
pygobject 绑定(bind)的文件夹。我在其上创建包的 Linux 是 64 位的,而我运行该程序的 Windows 也是 64 位的。
使用 Dependency-Walker 我可以看到缺少 2 个 DLL:GPSVC.DLL
和 IESHIMS.DLL
.
我在系统上找到了这两个 DLL,并将它们复制到测试程序的不同目录中,但没有用。
这可能对导入错误有用:
最佳答案
我和Thomas K一起工作过,pynsist 的作者,解决了这个问题。我确实想宣传它是一个很棒的工具,有很好的支持,在我看来,它使打包变得容易了几个数量级。
我的方法中有很多错误(见问题),所以只描述正确的方法可能更容易:
仅导入的程序所需的唯一依赖项:
from gi.repository import Gtk
是最新的 pygi-aio
(当前为 pygi-aio-3.14
)包,可以在这里下载(pynsist-repository 中的示例有一个下载脚本,但我可能需要针对较新的版本进行更新):
现在已合并到 pynsist-repository 中的 PyGObject/PyGI 示例附带一个脚本,可从包中提取必要的依赖项(参见:https://github.com/takluyver/pynsist/tree/master/examples/pygi_mpl_numpy)。
最重要的是,它提取绑定(bind) zip 文件的内容(针对目标 Python 版本和位数修改脚本)并将它们复制到 pynsist_pkgs
文件夹中:
- cairo
- dbus
- gi
- gnome
- pygtkcompat
然后它将子依赖项提取并复制到 pynsist_pkgs/gnome/
文件夹中。作为lazka指出,典型的最小 Gtk 程序的最低要求是(每个库都有一个 pygi/noarch
和 pygi/[TargetedArchitecture]
zip 文件):
- ATK
- Base
- Gdk
- GDKPixbuf
- GTK
- JPEG
- Pango
- WebP
- TIFF
然后在我的案例中使用以下方式构建安装程序:
python3 -m nsist installer.cfg
installer.cfg
也在存储库示例文件夹中。它只需要列出 gnome
(gnome 文件夹中的子依赖项作为一个单元运行)。
当 pygi-aio 安装在 Windows 机器上时,安装程序会执行一些安装后编译步骤。如果您使用这种方法,这可能会成为一个问题,因为它只提取依赖项。在某些情况下,您可能需要运行一个 exe 文件(随 bundle 提供)并将编译后的文件复制回您的构建目录。我描述了我在这里遇到的唯一问题:
这里有一个包含更多信息的错误报告:
你可以在这里得到例子:
关于packaging - 用pynsist打包PyGObject Python 3程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28794406/
我是一个Python新手,所以请耐心等待。 我正在尝试将 PyQt4 应用程序与 pynsist 捆绑在一起。我想导入依赖于模块 B、C 和 D 的模块 A,但在 installer.cfg 文件中指
我正在尝试复制以下示例:https://github.com/takluyver/pynsist/tree/master/examples/tkinter但它不起作用。我有一个从此处复制粘贴的 pyt
我正在尝试使用 pynsist 为我的 python 应用程序创建一个安装程序,它使用 PyQt4。我想捆绑 python 安装,因此,我必须使用 python 3.5,因为 pynsist 仅支持
我在 3.6 中编写了一个小型 python 程序来自动执行我每月在工作中执行的任务。它可能对与我一起工作的其他人有用,因此我一直在尝试将其与 Pynsist 捆绑在一起。 捆绑之前,程序从 IDLE
我正在用最新版本的 Pynsist 打包一个 Python 2.7 程序。 我在 this 之后创建了一个 installer.cfg 文件例子。 但是当我尝试打包我的应用程序运行时 pynsist
我使用 PyQt5 构建了一个 GUI,并希望通过将其与 pynsist 打包来将其分发到未安装 Python 的其他计算机。不幸的是,当启动安装程序生成的快捷方式时,GUI 没有按预期打开,并且 P
我是一名优秀的程序员,十分优秀!