构建 pyinstaller 可执行文件时,我可以控制架构(32 位与 64 位)吗?

Posted

技术标签:

【中文标题】构建 pyinstaller 可执行文件时,我可以控制架构(32 位与 64 位)吗?【英文标题】:Can I control the architecture (32bit vs 64bit) when building a pyinstaller executable? 【发布时间】:2011-11-01 14:55:24 【问题描述】:

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

背景 我从 py2exe 迁移到 pyinstaller,因为缺乏 64 位支持以及许多我很难回顾过去的小事情。所以在这点上,我宁愿 not 回到它。我已经使用 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。

【问题讨论】:

我知道您有一个可行的解决方案,但是您是否尝试在 Win7 机器上安装 32 位 Python 并使用它来运行 build.py?您还必须安装所有 32 位依赖项,但这应该获取正确的 32 位 DLL。 (另一方面,如果您需要支持 XP,它可能无法正常工作。) @Velociraptors:我不希望它抓取的唯一 DLL 是 USB 加密狗的 DLL。该设备的软件只有 32 位,所以我冒昧地猜测驱动程序也是 32 位的。所以在这种情况下,我认为这是 7 vs XP 驱动程序不兼容的问题。 【参考方案1】:

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

如前所述,由于交叉兼容性问题,构建 32 位二进制文​​件会更好。 也许您可以详细说明您的问题。

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

很抱歉这么长时间没有回复。我同意你的观点,如果不需要 64 位,请不要使用它。但是,如果我运行的是 Windows 7 64 位和 64 位 Python,如何创建 32 位版本?这才是真正的问题。 @AdamLewis,同时安装 32 位 python,并让您的构建脚本生成两个可执行文件。【参考方案3】:

如果您想在 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,您还可以通过这种方式构建应用程序。

【讨论】:

以上是关于构建 pyinstaller 可执行文件时,我可以控制架构(32 位与 64 位)吗?的主要内容,如果未能解决你的问题,请参考以下文章

Pyinstaller 可执行文件打开并立即关闭

Python - 使用Pyinstaller将Python代码生成可执行文件

pyinstaller 找不到自定义导入的模块

使用 PyInstaller 在 --onefile 中使用 QML 构建 PyQt5

pyinstaller简要使用说明

pyinstaller exe黑屏