35

简短的问题
在构建 pyinstaller 可执行文件时,有什么方法可以控制/保证架构(32 位与 64 位)?

背景
我从 py2exe 迁移到 pyinstaller,因为缺乏 64 位支持以及许多我很难回顾过去的小事情。因此,在这点上,我宁愿回头。我已经使用 Python 2.7 64 位开发了两个应用程序,并且在 32 位机器上运行时遇到了性能问题。

第一个是一个简单的 wxPython GUI(2.9 版)并连接到一个用于 USB 驱动程序的 Windows DLL 文件。这个以 32 位运行似乎非常“安全”,因为没有仅 64 位的模块。但是,在 32 位 Windows XP 上运行时,此应用程序在与 USB 设备通信时会出现可怕的性能问题。

第二个应用程序要大得多,由于担心架构问题,我还没有尝试构建和运行。此应用程序中使用了一些仅限 64 位的模块(一个为 psycopg2)。如果无法作为 32 位可执行文件运行, 我想远离尝试构建它。

目前的想法
我觉得这可能是可能的(如果模块支持 32 位),通过在 32 位模式下强制运行 Python 的 build.py。这有道理吗?

更新
我正在构建的第一个程序有几个突破。事实证明,性能问题完全取决于两台机器的速度。我的开发机器有足够的能力足够快地轮询 USB 设备,而速度慢得多的测试平台 (Windows XP) 则没有。

我通过修改轮询 USB 端口的方式解决了这个问题。现在这个问题已经解决了,我可以在两个系统上运行 exe。尝试将可执行文件构建为单个文件时出现了一个新问题。运行 pyinstaller 的 Build.py 时,它会引入应用程序运行所需的所有 DLL。起初这似乎很好用,但是当我尝试运行在 Windows 7 64 位上构建的单个 exe 时,它​​无法在 Windows XP 上运行,因为 USB 加密狗的 DLL 未被识别为有效的 DLL。

为了让单个 exe 在两个系统上运行,我首先尝试从 .spec 文件(这似乎是一个 python 脚本)中删除 DLL。这很方便,因为我能够在构建命令之前使用普通的 python 列表修饰符修改包含列表。我的希望是,如果在 exe 的临时目录中找不到 DLL,它会在系统 PATH 中找到它。虽然这种方法可能有效,但我无法让它在不引发大量错误的情况下运行。

我的第二次尝试是在 Windows XP 机器上构建应用程序(保留 DLL 嵌入),希望 Win XP DLL 可以在 Windows 7 中工作。成功!这种配置效果很好;但是我坚信这不是最好的解决方案,因为它完全取决于在新操作系统上运行的旧 DLL。

4

3 回答 3

14

Pyinstaller 根据你用来构建它的 python 生成一个二进制文件。因此,据我所知,如果您使用 python 2.7 64 位,则不可能生成 32 位可执行文件。这是因为 Pyinstaller 归档了所有模块及其依赖项(dll、pyds 等),由于 python 安装,它们是 64 位的。

如前所述,由于交叉兼容性问题,构建 32 位二进制文​​件会更好。可能您可以指定更多您的问题。

于 2012-04-26T06:50:30.903 回答
8

如果您正在构建一个应用程序并且它在 32 位 Windows 上运行良好,则无需创建 64 位版本。只需创建一个 32 位版本并在两种架构上运行它。WOW64 是干什么用的。

如果您需要使用仅 64 位的库或功能,只需构建 64 位版本。如果功能只是 64 位,则构建 32 位版本没有意义。

构建 64 位和 32 位版本的唯一原因是利用 64 位窗口增加的地址空间。即,如果您打算分配超过 1 或 2 GB 的内存。一个示例可能是图像编辑应用程序或数据处理应用程序。然后你可以在平台的限制下在 32 位平台上运行,但在 64 位平台上编辑更大的图像或更大量的数据。

IOW,对于您的情况,如果您正在构建 32 位 exe,请遵循 @Velociraptors 的建议并构建 32 位 python。

于 2012-01-20T12:30:25.673 回答
4

如果要在 64 位系统上构建 32 位应用程序并且只安装了 64 位版本的 Python,则还必须安装 32 位版本的 Python。然后您必须将 pyinstaller 安装到该 32 位 Python 版本,如下所示:

path/to/32-bit/python -m pip install pyinstaller

之后,您可以运行 32 位版本的 pyinstaller,从而构建一个 32 位应用程序,如下所示:

path/to/32-bit/pyinstaller your-app.py

在 Windows 10 上,pyinstaller.exe位于C:\Users\<user>\AppData\Local\Programs\Python\Python<version>-32\Scripts\pyinstaller.exe.

如您所见,您要构建的应用程序的架构取决于您将用于构建该应用程序的 Python 和 pyinstaller 版本。例如,如果系统上安装了 Python 版本 2.x,您还可以通过这种方式构建应用程序。

于 2021-05-17T15:09:28.703 回答