简短的问题
在构建 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 文件(这似乎是一个 python 脚本)中删除 DLL。这很方便,因为我能够在构建命令之前使用普通的 python 列表修饰符修改包含列表。我的希望是,如果在 exe 的临时目录中找不到 DLL,它会在系统 PATH 中找到它。虽然这种方法可能有效,但我无法让它在不引发大量错误的情况下运行。
我的第二次尝试是在 Windows XP 机器上构建应用程序(保留 DLL 嵌入),希望 Win XP DLL 可以在 Windows 7 中工作。成功!这种配置效果很好;但是我坚信这不是最好的解决方案,因为它完全取决于在新操作系统上运行的旧 DLL。