gpt4 book ai didi

packaging - 用pynsist打包PyGObject Python 3程序?

转载 作者:行者123 更新时间:2023-12-04 18:02:17 29 4
gpt4 key购买 nike

我想用 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)是什么?

编辑 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 的发生是因为有一个 _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 位的。

编辑 2:

使用 Dependency-Walker 我可以看到缺少 2 个 DLL:GPSVC.DLLIESHIMS.DLL .

编辑 3:

我在系统上找到了这两个 DLL,并将它们复制到测试程序的不同目录中,但没有用。

编辑 4:

这可能对导入错误有用:

最佳答案

我和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/noarchpygi/[TargetedArchitecture] zip 文件):

 - ATK
- Base
- Gdk
- GDKPixbuf
- GTK
- JPEG
- Pango
- WebP
- TIFF

构建安装程序

然后在我的案例中使用以下方式构建安装程序:

 python3 -m nsist installer.cfg

installer.cfg 也在存储库示例文件夹中。它只需要列出 gnome(gnome 文件夹中的子依赖项作为一个单元运行)。

关于 pygi-aio 包的注意事项

当 pygi-aio 安装在 Windows 机器上时,安装程​​序会执行一些安装后编译步骤。如果您使用这种方法,这可能会成为一个问题,因为它只提取依赖项。在某些情况下,您可能需要运行一个 exe 文件(随 bundle 提供)并将编译后的文件复制回您的构建目录。我描述了我在这里遇到的唯一问题:

这里有一个包含更多信息的错误报告:

工作示例

你可以在这里得到例子:

关于packaging - 用pynsist打包PyGObject Python 3程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28794406/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com