PySide无法冻结PyQt4移植 - PyInstaller,py2exe或cx_Freeze

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 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 错误日志

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错误日志

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

我能找到的最接近的是这里,但我没有使用那个库,所以我不认为它适用,也不知道如何解决。

关于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/dlls放入dist文件夹(py2exe)

  5. 在PyInstaller错误上运行sxstrace并生成日志文件 - 不确定我在寻找什么,我没有看到任何事件查看器或消息框没有告诉我的东西(只是更多的信息)

  6. 重新安装所有python/modules、pyqt、pyside、VSE2008 C++版本、微软SDK、微软.netframe work 2.0?、Microsoft Visual C++ 2008 Redistributable Package

  7. 移植所有未完成的模块,这些模块不需要打包但在目录中

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

  9. 将qt.conf(似乎只有pyqt4才有?)和插件手动复制到dist文件夹中


2
你尝试过使用 PySide 的示例代码而非自己的应用程序吗?我刚刚使用 PyInstaller 尝试了 appchooser 示例,使用几乎相同的 PySide/Qt/Python 设置,没有遇到任何问题。 - Austin Phillips
没错,它们工作正常。我将逐个将每个小部件转换为可执行文件,直到找到问题所在。然后重新构建有问题的小部件并进行相同的过程。 - Steve Lee
尝试在.manifest文件中注释掉MCF:<!--<dependentAssembly> <assemblyIdentity name="Microsoft.VC90.MFC" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b" type="win32" version="9.0.21022.8"/> </dependentAssembly>--> - frmdstryr
1个回答

3
我使用py2exe成功创建了一个可执行文件(在cx_freeze和PyInstaller中则较为困难)。我通过将每个模块转换成独立的exe文件来进行调试。
这样一来,我发现了其他方法无法复制的错误。
其中主要的问题出在一个模块中,因为它没有将 PyQt4 转换为 PySide。
需要注意的是,这是一个数据加载模块,并且在创建可执行文件之前测试时,可能只是简单地遗漏了这个操作。所有其他的 PySide 转换已经完成了。 注:
from PySide import QtCore, QtGui

即使您的IDE没有使用QtCore并且Python在不出问题的情况下运行该模块,仍然需要Qtcore来制作该模块的exe。即使可以通过Python使其正常工作,也需要Qtcore来创建可执行文件。
这对于制作主窗口的exe实际上是不必要的,但能够为该模块创建一个操作exe很有帮助。

转换程序结果

py2exe-运行良好!

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

cx_Freeze

有些不稳定,且无法提供解释原因的说明...

我有3个近乎相同的进程,用于加载数据,唯一的区别是它们所加载的文件。其中一个用于较小的文件可以正常加载,而用于较大文件时只是挂起并在运行之前退出...甚至无法在它们的前面放置msgbox时让它们工作。

类似地,我有一个对话框需要检索数据并进行一些计算才能show(),但它什么都没做——不知道为什么。主窗口和大多数程序都能工作。

PyInstaller

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

当尝试运行时出现以下错误: ImportError: No module named pythoncom

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

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

使用PyInstaller的第二个问题

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

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

上述情况不会在独立应用程序中使用py2exe发生。

这种策略(添加一个未使用的导入)是非常有效的! - ak112358

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接