用pynsist打包PyGObject Python 3程序?

2024-01-06

我想用 pynsist 打包一个 Python3-PyGObject 程序。该存储库有一个 PyGTK 的示例,它让我认为更改该示例应该不会太难。

该示例可以在这里找到:

  • https://github.com/takluyver/pynsist/tree/master/examples/pygtk https://github.com/takluyver/pynsist/tree/master/examples/pygtk

在此文件中(https://github.com/takluyver/pynsist/blob/master/examples/pygtk/grab_files.sh https://github.com/takluyver/pynsist/blob/master/examples/pygtk/grab_files.sh)我认为只需获取针对 GTK 3 的文件(http://www.gtk.org/download/win32.php 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 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 https://python-gtk-3-tutorial.readthedocs.org) 将会?

Edit 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-64pygobject 绑定的文件夹。我创建包的 Linux 是 64 位,我运行程序的 Windows 也是 64 位。

Edit 2:

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

Edit 3:

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

Edit 4:

这对于导入错误可能有用:

  • import gtk/glib 产生 ImportError: DLL load failed https://stackoverflow.com/questions/3091281/import-gtk-glib-produces-importerror-dll-load-failed

我曾与Thomas K https://stackoverflow.com/users/434217/thomas-kpynsist 的作者来解决这个问题。我确实想宣传它是一个很棒的工具,有很好的支持,在我看来,它使打包变得更容易。

我的方法有很多错误(参见问题),因此描述正确的方法可能会更容易:

下载依赖项

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

 from gi.repository import Gtk

是最新的pygi-aio(现在pygi-aio-3.14)可以在此处下载的捆绑包(pynsist-repository 中的示例有一个下载脚本,但我可能需要更新以获取较新的版本):

  • https://sourceforge.net/projects/pygobjectwin32/files/ https://sourceforge.net/projects/pygobjectwin32/files/

提取依赖项

PyGObject/PyGI 示例现已合并到 pynsist-repository 中,附带一个脚本,可从包中提取必要的依赖项(请参阅:https://github.com/takluyver/pynsist/tree/master/examples/pygi_mpl_numpy https://github.com/takluyver/pynsist/tree/master/examples/pygi_mpl_numpy).

最重要的是,它提取绑定 zip 文件的内容(修改目标 Python 版本和位数的脚本)并将其复制到pynsist_pkgs folder:

  - cairo
  - dbus
  - gi
  - gnome
  - pygtkcompat

然后它提取子依赖项并将其复制到pynsist_pkgs/gnome/文件夹。作为lazka https://stackoverflow.com/users/3201632/lazka指出,典型的最小 Gtk 程序的最低要求是(每个库都有一个pygi/noarch and pygi/[TargetedArchitecture]zip 文件):

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

构建安装程序

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

 python3 -m nsist installer.cfg

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

关于 pygi-aio 包的注意事项

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

  • https://github.com/tobias47n9e/innsbruck-steregraphic/issues/1 https://github.com/tobias47n9e/innsbruck-stereographic/issues/1

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

  • https://sourceforge.net/p/pygobjectwin32/tickets/12/ https://sourceforge.net/p/pygobjectwin32/tickets/12/

工作示例

您可以在这里获取示例:

  • https://github.com/takluyver/pynsist/tree/master/examples/pygi_mpl_numpy https://github.com/takluyver/pynsist/tree/master/examples/pygi_mpl_numpy
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用pynsist打包PyGObject Python 3程序? 的相关文章

随机推荐

  • ES6 之前的类中的静态函数

    我的问题 见下文 是如何声明 STATIC 函数和常量pre ES6类所以它们可以被继承 在问题之前我们已经对当前的 ES6 类和 ES6 之前的类进行了回顾 因此我们都使用相同的约定 在 ES6 之后 我们可以在类中定义静态函数 如下所示
  • 实时显示中表格的垂直溢出应滚动内容

    我正在使用一个Live https rich readthedocs io en stable live html显示内容Table https rich readthedocs io en stable tables html随着时间的推
  • 在 C++ 中获取文本文件的第 n 行

    我需要读取文本文件的第 n 行 例如textfile findline 0 会找到加载的文本文件的第一行ifstream textfile 这可能吗 我不需要将文件的内容放入数组 向量中 我只需将文本文件的特定行分配给变量 特别是 int
  • NSDate/NSDateFormatter - 只存储时间,不存储日期?

    我一直在环顾四周 但没有看到任何可以解决这个问题的东西 所以我希望有人可以帮助我解决这个问题 我想做的是使用 NSDate 变量 在核心数据中 来存储时间 而不是日期和时间 而只是格式为 HH MM SS 的时间 查看 NSDateForm
  • 相对于旋转角度的矩形坐标

    我正在尝试使用 Surfaceview 和画布绘图在 Android 中创建自定义组件 这些组件可以通过触摸来调整大小和旋转 考虑创建一个图像视图 其顶部 右侧 底部和左侧边缘可通过触摸并拖动所需边缘进行缩放 我在用RectF为了保持组件的
  • 创建创建组的 django 数据迁移的正确方法?

    我想创建创建权限和组的数据迁移 以便我的其他开发人员可以运行迁移并完成所有设置 我能够创建迁移并运行它们 但现在运行测试时出现错误 但如果我这样做 from django contrib auth models import Group d
  • C++ vtable 通过虚拟继承进行解析

    我对 C 和虚拟继承很好奇 特别是解决低音类和子类之间 vtable 冲突的方式 我不会假装了解它们如何工作的具体细节 但到目前为止我所看到的是 由于该分辨率 使用虚拟函数会导致一些小的延迟 我的问题是基类是否为空 即它的虚拟函数定义为 v
  • 使用 MPI 和 openMP 并行运行代码时扩展性较差

    我有以下实现 int main int argc char argv int n runs 100 Number of runs int seed 1 int arraySize 400 initialise the random numb
  • 您可以使用 Liquibase 初始化 Spring Batch 元数据表吗?

    目前我有如下设置 在本地运行批处理作业时 该作业将使用以下命令自动创建必要的元数据表 data source财产价值自initialize schema设置为始终 Liquibase 还将运行并创建其变更日志中列出的任何表 这是我的appl
  • SSL 证书验证失败 (_ssl.c:600)

    你知道这个错误吗 urlopen error SSL CERTIFICATE VERIFY FAILED certificate verify failed ssl c 600 This error occurred on my serve
  • 如何将 UIView 渲染到 CGContext 中

    我想将 UIView 渲染到 CGContextRef 中 void methodName CGContextRef ctx UIView someView UIView alloc init MagicalFunction ctx som
  • Spring 3.1:DataSource 未自动连接到 @Configuration 类

    我正在使用 Spring MVC 3 1 0M2 并尝试将我的配置移动到 java beans 但我遇到以下错误 2011 09 14 18 43 42 301 警告 不可用的org springframework beans factor
  • 无需索引即可搜索文件内字符串的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我必须在一个非常旧的遗留应用程序中更改一些连接字符串 而制作它的程序员认为在整个应用程序中到处都贴上连接
  • Laravel,NPM:找不到命令“mix”

    有谁知道为什么它会抛出以下错误以及如何修复它 我还尝试使用重新安装所有软件包npm install几次 在 Windows 上重新安装 NodeJS 不起作用 我正在使用 Laravel 8 22 0 Full Log 0 verbose
  • MediaSession 在锁定屏幕上不显示背景

    我在用MediaSession在 Lollipop 上控制播放 它似乎有效 因为我的 Android Wear 设备允许我控制播放 但是手机锁定屏幕不显示来自METADATA KEY ALBUM ART URIAndroid Wear 上的
  • react-admin 中资源路由的自定义路径

    有没有办法指定资源的自定义路径 例子
  • 你如何在 Symfony2 项目中组织你的包? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 更改表主键 - Crate DB

    我想更改我的表Crate DB更改主键约束以向现有列添加一列 如果我需要删除约束并创建一个新约束 那么 SQL 语法是什么 我一直在尝试传统的 SQL 语法 但它似乎不起作用 alter table my data table drop p
  • 正测试用例和负测试用例

    什么是阳性测试用例 and 负面测试用例 在谷歌上搜索后 我发现了非常令人困惑的答案 谁能用例子解释一下吗 积极的测试用例测试系统是否做了它应该做的事情 示例 提供有效凭据后将允许您登录 负面测试用例测试系统没有做不应该做的事情 示例 当提
  • 用pynsist打包PyGObject Python 3程序?

    我想用 pynsist 打包一个 Python3 PyGObject 程序 该存储库有一个 PyGTK 的示例 它让我认为更改该示例应该不会太难 该示例可以在这里找到 https github com takluyver pynsist t