首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >软件包PyGObject Python3程序与平斯手?

软件包PyGObject Python3程序与平斯手?
EN

Stack Overflow用户
提问于 2015-03-01 14:04:42
回答 1查看 1.3K关注 0票数 3

我想打包一个Python3-PyGObject程序和pynsist。存储库为PyGTK提供了一个示例,它使我认为更改示例应该不会太困难。

这个例子可以在这里找到:

在这个文件(files.sh)中,我认为只需抓取针对GTK 3(http://www.gtk.org/download/win32.php)的文件:

代码语言:javascript
复制
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包中了:

代码语言:javascript
复制
 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):

代码语言:javascript
复制
[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上打包和安装程序之后,启动测试程序将产生以下跟踪:

代码语言:javascript
复制
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-file。

这是当前的布局:

代码语言:javascript
复制
 - 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.DLLIESHIMS.DLL

编辑3:

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

编辑4:

这可能对导入错误有用:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-03 14:08:11

我和Thomas K合作解决了这个问题,他是pynsist的作者。我也想宣传一下,这是一个很好的工具,有了很好的支持,在我看来,它使包装订单变得更容易。

在我的方法中有许多错误(见问题),所以只描述正确的方法可能更容易:

下载依赖关系

仅导入的程序所需的唯一依赖项:

代码语言:javascript
复制
 from gi.repository import Gtk

是可以在这里下载的最新的pygi-aio (当前为pygi-aio-3.14)包(pynsist中的示例有一个下载脚本,但我可能需要更新更新版本):

提取依赖关系

PyGObject/PyGI示例现在已经合并到pynsist存储库中,它附带了一个从包中提取必要依赖项的脚本(请参阅:numpy)。

最重要的是,它提取绑定压缩文件的内容(为目标Python版本和bitness修改脚本),并将它们复制到pynsist_pkgs文件夹中:

代码语言:javascript
复制
  - cairo
  - dbus
  - gi
  - gnome
  - pygtkcompat

然后提取子依赖项并将其复制到pynsist_pkgs/gnome/文件夹中。正如lazka所指出的,典型的最小Gtk-程序的最低要求是(每个库都有一个pygi/noarchpygi/[TargetedArchitecture]压缩文件):

代码语言:javascript
复制
 - ATK
 - Base
 - Gdk
 - GDKPixbuf
 - GTK
 - JPEG
 - Pango
 - WebP
 - TIFF

构建安装程序

然后,在我的情况下,使用以下方法构建安装程序:

代码语言:javascript
复制
 python3 -m nsist installer.cfg

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

关于pygi-aio包的注意事项

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

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

工作实例

你可以在这里得到一个例子:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28794406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档