简短问题
在构建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位模式下强制使用Python运行build.py,这可能是可能的(如果模块支持32位)。这有意义吗?
更新
我在建造的第一个项目上取得了一些突破。事实证明,性能问题完全取决于两台机器的速度。我的开发机器有足够的能力足够快地轮询USB设备,而速度慢得多的测试平台(Windows XP)没有。
我通过修改我查询USB端口的方式解决了这个问题。既然已经修复了,我可以在两个系统上运行exe。尝试将可执行文件构建为单个文件时出现了一个新问题。当运行pyinstaller的Build.py时,它会提取应用程序运行所需的所有DLL。这看起来效果很好,但是当我尝试运行我在Windows 7 64bit上构建的单个exe时,它不能在Windows XP上运行,因为USB加密狗的DLL未被识别为有效的DLL。
为了让单个exe在两个系统上运行,我首先尝试从.spec文件中删除DLL(这似乎是一个python脚本)。这很方便,因为我能够使用普通的python列表修饰符修改构建命令之前的包含列表。我希望如果在exe的临时目录中找不到DLL,它会在系统路径上找到它。虽然这种方法可能工作,但我无法在不丢失大量错误的情况下运行它。
我的第二次尝试是在Windows XP机器上构建应用程序(保留嵌入的DLL),希望Win XP DLL可以在Windows 7中运行。成功!这种配置效果很好;但我坚信这不是最好的解决方案,因为它完全取决于在较新的操作系统上运行的旧DLL。
答案 0 :(得分:10)
Pyinstaller根据您用来构建它的python生成二进制文件。因此,如果您使用python 2.7 64位,据我所知,生成32位可执行文件是不可能的。这是因为Pyinstaller归档所有模块及其依赖项(dll,pyds等),由于python安装,它们是64位。
正如已经说过的,由于交叉兼容性问题,构建32位二进制文件会更好。 您可以指定更多问题。
答案 1 :(得分:7)
如果要构建应用程序并且它在32位Windows上运行正常,则无需创建64位版本。只需创建一个32位版本并在两种架构上运行它。 WOW64的用途是什么。
如果您需要使用仅64位的库或功能,只需构建一个64位版本。如果该功能仅为64位,则构建32位版本毫无意义。
构建64位和32位版本的唯一原因是利用增加的64位窗口的地址空间。即如果您打算分配超过1或2 GB的内存。示例可以是图像编辑应用程序或数据操纵应用程序。然后,您可以在平台的约束下在32位平台上运行,但在64位平台上编辑更大的图像或更大量的数据。
IOW,对于你的情况,请遵循@Velociraptors的建议,并在构建32位exe时构建32位python。
答案 2 :(得分:0)
如果您想在 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 版,您还可以通过这种方式构建应用程序。