在构建pyinstaller可执行文件时,我可以控制体系结构(32位与64位)吗



简短问题
在构建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文件中删除DLL(它看起来是一个python脚本(。这很方便,因为我可以在生成命令之前用普通的python列表修饰符修改includes列表。我希望如果在exe的临时目录中找不到DLL,它会在系统PATH中找到它。虽然这种方法可能有效,但我无法在运行时不抛出大量错误。

我的第二次尝试是在Windows XP机器上构建应用程序(嵌入DLL(,希望Win XP DLL能在Windows 7中工作。成功此配置运行良好;然而,我坚信这不是最好的解决方案,因为它完全依赖于运行在新操作系统上的旧DLL。

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

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

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

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

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

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

如果您想在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>AppDataLocalProgramsPythonPython<version>-32Scriptspyinstaller.exe

正如您所看到的,您想要构建的应用程序的体系结构取决于您将用于构建该应用程序的Python和pyinstaller版本。通过这种方式,例如,如果您在系统上安装了Python版本2.x,您也可以从该版本构建应用程序。

最新更新