3

我将编写的 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 错误日志

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 的 Line11 = 从 PySide 导入 QtGui,QtCore

PyInstaller 错误日志

"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"

我试过的

  1. 将“C:\Python27\Lib\site-packages\PySide”放在环境变量路径的开头

  2. 将 msvcr90.dll、msvcp90.dll、msvcm90.dll 的副本放入 Python/dll 位置:我相信仅 msvcp90.dll 就允许 py2exe 生成可操作的 PyQt4 exe

  3. 使用 pyside-rcc 重新制作所有 qrc 资源文件

  4. 将所有 pyside/dll 放入 dist 文件夹(py2exe)

  5. 运行 sxstrace 并在 PyInstaller 错误时生成日志文件 - 不确定我在寻找什么我没有看到事件查看器或 msgbox 尚未告诉我的任何内容(只是更多)

  6. 重新安装了所有 python/模块、pyqt、pyside、VSE2008 C++ 版、microsoft SDK、microsoft .netframe work 2.0?、Microsoft Visual C++ 2008 Redistributable Package、

  7. 移植了软件包不需要但位于目录中的所有正在进行的模块

  8. 删除了任何未成功移植/未连接的 WIP 模块

  9. 复制(手动不 setup.py)qt.conf(似乎不存在仅用于 pyside pyqt4?)和插件到 dist 文件夹

4

1 回答 1

3

我设法使用 py2exe 获得了一个工作可执行文件(在 PyInstaller 中根本没有 cx_freeze)。我能够通过将每个模块转换为独立的 exe 来调试它。

  • 这设法揭示了无法以其他方式复制的错误。
  • 上述错误的主要问题是缺少在一个模块中将 PyQt4 转换为 PySide

请注意,这是一个数据加载模块,在创建 exe 之前测试我的端口时一定只是错过了单击它。所有其他 PySide 转换已经完成。

注意:

from PySide import QtCore, QtGui

即使您的 IDE 说 QtCore 未在使用中并且 python 运行该模块而没有问题,它也始终是必需的。即使您可以在没有 QtCore 的情况下通过 Python 使其工作,也需要为该模块制作一个 exe。

这对于制作主窗口的 exe 并不是真正需要的,但是能够为模块创建一个可操作的 exe 是有帮助的。


转换计划结果

py2exe - 工作!

没有什么特别的,只是一个标准的 setup.py 文件可以正常工作。

cx_Freeze

有点作品,但它的行为不规律,并且没有解释为什么......

我有 3 个几乎相同的数据加载过程,主要区别在于它们加载的文件。较小文件的加载很好,较大的文件在运行之前只是挂起并退出某处......当将 msgbox 放在它们的前面时甚至无法让它们工作。

同样,我有一个对话框,它必须在 show() 之前检索数据并进行一些计算……它什么也不做——不知道为什么。主窗口和大部分程序都可以工作。

PyInstaller

我可以为所有单独的模块创建 exe,但不能为主窗口模块创建 exe。尝试运行它时,我收到了与Ticket#590完全相同的问题,只是我使用的是 pywin32-218 并且没有使用 panda。

尝试运行时发生:ImportError: No module named pythoncom

构建过程指示: 警告:pythoncom 正在将其名称更改为 pythoncom27 警告:pywintypes 正在将其名称更改为 pywintypes27

真正奇怪的部分是实际从 pywin32 导入的模块可以变成一个可操作的 exe。调用此模块的小部件也可以,但调用这些其他小部件的主窗口会给出错误。

PyInstaller 的第二个问题

所有重新实现关闭事件的独立小部件在关闭时都会挂起。

def closeEvent(self, event):
    self.results.addResultsToDB()
    event.accept()

py2exe 作为独立应用程序不会发生上述情况。

于 2013-01-05T23:23:15.057 回答