我将我编写的 PyQt4 应用程序移植到 PySide,但我无法为其创建可执行文件。我曾尝试使用 py2exe、cx_freeze 和 PyInstaller 为 PySide 创建 exe,前两个提供了类似的错误(在构建期间没有提供错误报告,在我尝试运行 exe 之前一切都很好)- PyQt4 版本可通过以下方式卡住py2exe.
系统信息
Windows 7,64 位 - 所有软件均为 32 位版本,低于所使用的软件包:
- Python 2.7.3 通过 Python(x,y) 2.7.3.1
- Qt 4.8.2
- PySide 1.1.2
- NumPy 1.6.2
- Pywin32 218-1
Exe 转换程序
- PyInstaller 2.0
- cx_Freeze 4.3.1-1
- py2exe 0.6.9
py2exe err.Log
Traceback (most recent call last):
File "myApp.pyw", line 11, in <module>
File "PySide\QtGui.pyc", line 12, in <module>
File "PySide\QtGui.pyc", line 10, in __load
ImportError: DLL load failed: The specified procedure could not be found.
cx_freeze err.Log
Traceback (most recent call last):
File "C:\Python27\Lib\site-packages\cx_Freeze\initscript\Console.py",
line 27, in <module>
exex code in m.__dict__
File "myApp.pyw", line 11, in <module>
File "ExtensionLoader_PySide_QtGui.py", line 11, in <module>
ImportError: DLL load failed: The specified procedure could not be found.
仅供引用: MyApp.pyw 的第 11 行 = from PySide import QtGui, QtCore
PyInstaller err.Log
"The application has failed to start because its side-by-side configuration is
incorrect. Please see the application event log or use the command-line sxstrace.exe
tool for more detail."
我能找到的最接近的是 here但我没有使用那个库,所以我认为它不适用,我也不知道如何解决这个问题。
关于 PyInstaller 错误的 SxsTrace 片段
INFO: Reference: Microsoft.VC90.CRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32 ",version="9.0.21022.8"
我尝试过的
将“C:\Python27\Lib\site-packages\PySide”放在环境变量路径的开头
将以下文件的副本:msvcr90.dll、msvcp90.dll、msvcm90.dll 放入 Python/dll 位置:我相信 msvcp90.dll 单独允许 py2exe 生成可运行的 PyQt4 exe
使用 pyside-rcc 重新制作所有 qrc 资源文件
将所有 pyside/dll 放入 dist 文件夹 (py2exe)
运行 sxstrace 并在 PyInstaller 错误上生成日志文件 - 不确定我在寻找什么我没有看到事件查看器或 msgbox 没有告诉我的任何东西(只是更多)
重新安装了所有 python/modules、pyqt、pyside、VSE2008 C++ 版本、microsoft SDK、microsoft .netframe work 2.0?、Microsoft Visual C++ 2008 Redistributable Package,
移植了包不需要但在目录中的所有进行中的模块
删除了所有未成功移植/未连接的 WIP 模块
复制(手动不是 setup.py)qt.conf(pyside 似乎不存在,只有 pyqt4?)和 dist 文件夹的插件
最佳答案
我设法使用 py2exe 获得了一个工作的可执行文件(在 PyInstaller 中根本没有使用 cx_freeze)。我能够通过将每个模块转换为独立的 exe 来调试它。
- 这设法揭示了无法通过其他方式复制的错误。
- 上述错误的主要问题是缺少在一个模块中将 PyQt4 转换为 PySide
请注意,这是一个数据加载模块,一定是在创建 exe 之前测试我的端口时错过了点击它。所有其他 PySide 转换都已完成。
注意:
from PySide import QtCore, QtGui
即使您的 IDE 说 QtCore 未在使用中并且 python 运行该模块也没有问题,它始终是必需的。这是为该模块制作一个 exe 所必需的,即使你可以在没有 QtCore 的情况下通过 Python 使它工作。
这并不是制作主窗口的 exe 实际需要的,但能够为模块创建一个可操作的 exe 是有帮助的。
转换计划结果
py2exe - 工作!
没什么特别的,只需一个标准的 setup.py 文件即可。
cx_Freeze
有点工作,但它的行为不稳定并且没有提供解释为什么......
我有 3 个几乎相同的数据加载过程,主要区别在于它们加载的文件。较小的文件加载很好,较大的文件在运行之前只是挂起并退出某个地方......当将 msgbox 放在它们前面时甚至无法让它们工作。
同样,我有一个对话框,它必须在 show() 之前检索数据并进行一些计算...它什么都不做 - 不知道为什么。主窗口和大部分程序都可以正常工作。
PyInstaller
我可以为所有单独的模块创建 exe,但不能为主窗口模块创建。当尝试运行它时,我收到了与 Ticket#590 完全相同的问题。除了我使用的是 pywin32-218 并且没有 Pandas 。
当试图运行这个时: 导入错误:没有名为 pythoncom 的模块
构建过程表明: 警告:pythoncom 正在将其名称更改为 pythoncom27 警告:pywintypes 正在将其名称更改为 pywintypes27
真正奇怪的部分是实际上从 pywin32 导入的模块可以变成一个可运行的 exe。调用此模块的小部件也可以,但调用这些其他小部件的主窗口会给出错误。
PyInstaller 第二期
所有重新实现关闭事件的独立小部件在关闭时挂起。
def closeEvent(self, event):
self.results.addResultsToDB()
event.accept()
上述情况不会发生在 py2exe 作为独立应用程序时。
关于python - PySide 无法卡住 PyQt4 端口 - PyInstaller、py2exe 或 cx_Freeze,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14152741/