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

Ada*_*wis 29 python windows usb pyinstaller 32bit-64bit

简短问题
在构建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位模式下强制运行build.py来运行.这有意义吗?

更新
我在我正在建设的第一个项目上取得了一些突破.事实证明,性能问题完全取决于两台机器的速度.我的开发机器有足够的能力足够快地轮询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.

J_Z*_*Zar 11

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

正如已经说过的,由于交叉兼容性问题,构建32位二进制文​​件会更好.您可以指定更多问题.


Ada*_*dam 8

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

path/to/32-bit/python -m pip install pyinstaller
Run Code Online (Sandbox Code Playgroud)

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

path/to/32-bit/pyinstaller your-app.py
Run Code Online (Sandbox Code Playgroud)

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

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


Ben*_*Ben 7

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

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

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

IOW,对于你的情况,请遵循@Velociraptors的建议,并在构建32位exe时构建32位python.

  • 很抱歉在回复中有这么长时间的延迟.我同意你的意见,如果不需要64位,请不要使用它.但是,如果我运行Windows 7 64位和64位Python,我该如何创建32位版本?这是真正的问题. (3认同)