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

41 投票
3 回答
54508 浏览
提问于 2025-04-17 00:09

简短问题
有没有办法在构建pyinstaller可执行文件时控制或保证架构(32位或64位)?

背景
我从py2exe转到pyinstaller,因为py2exe不支持64位,还有很多小问题让我很难忍受。所以我更希望不再回去使用它。我用Python 2.7的64位版本开发了两个应用程序,但在32位机器上运行时遇到了性能问题。

第一个是一个简单的wxPython图形界面(版本2.9),它连接到一个USB驱动程序的Windows DLL文件。这个应用程序在32位环境下运行似乎比较“安全”,因为没有64位专用的模块。然而,当在32位的Windows XP上运行时,这个应用程序在与USB设备通信时性能非常糟糕。

第二个应用程序要大得多,我还没有尝试构建和运行它,因为我担心架构问题。这个应用程序中有一些64位专用的模块(比如psycopg2)。如果不可能将其构建为32位可执行文件,我希望能避免尝试构建它。

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

更新
在我构建的第一个程序上,我有了一些突破。结果发现,性能问题完全是因为两台机器的速度不同。我的开发机器足够强大,可以快速轮询USB设备,而速度较慢的测试平台(Windows XP)则做不到。

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

为了让单个exe在两台系统上都能运行,我首先尝试从.spec文件中移除DLL(这个文件看起来像是一个Python脚本)。这很方便,因为我可以在构建命令之前用普通的Python列表修改器修改包含的列表。我希望如果exe的临时目录中找不到DLL,它会在系统PATH中找到。虽然这种方法可能有效,但我无法让它运行而不抛出很多错误。

我的第二次尝试是在Windows XP机器上构建应用程序(保留DLL嵌入),希望Windows XP的DLL能在Windows 7上工作。成功了!这个配置运行得很好;不过我确实认为这不是最佳解决方案,因为它完全依赖于旧的DLL在新系统上运行。

3 个回答

8

如果你想在64位系统上创建一个32位的应用程序,但只安装了64位的Python,那么你还需要安装一个32位的Python版本。接着,你需要在这个32位的Python版本上安装pyinstaller,方法如下:

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版本,你也可以用它来构建应用程序。

9

如果你正在开发一个应用程序,并且它在32位的Windows上运行得很好,那就没必要特意去做一个64位的版本。只需要做一个32位的版本,这样它就可以在两种架构上运行。WOW64就是为了这个目的而存在的。

如果你需要使用某个只能在64位系统上运行的库或功能,那就直接做一个64位的版本。如果某个功能只能在64位上使用,那做32位版本就没有意义了。

同时制作64位和32位版本的唯一理由,是为了利用64位Windows的更大内存空间。也就是说,如果你打算分配超过1或2GB的内存,比如说一个图像编辑应用程序或者数据处理应用程序,那就可以在32位平台上运行,但在64位平台上处理更大的图像或更多的数据。

换句话说,如果你要做的是32位的exe文件,建议你按照@Velociraptors的建议,在32位的Python环境中进行开发。

16

Pyinstaller 是一个工具,它会根据你用来创建它的 Python 版本生成一个可执行文件。所以,如果你使用的是 64 位的 Python 2.7,那么我知道的情况是,你不能生成 32 位的可执行文件。这是因为 Pyinstaller 会把所有的模块和它们的依赖项(比如 dlls、pyds 等等)打包在一起,而这些依赖项都是 64 位的,因为你安装的是 64 位的 Python。

正如之前所说的,由于跨平台兼容性的问题,生成 32 位的可执行文件通常是更好的选择。你可能可以更具体地说明一下你的问题。

撰写回答