PySide无法冻结PyQt4端口 - PyInstaller,py2exe或cx_Freeze

时间:2013-01-04 07:09:58

标签: python pyside py2exe pyinstaller cx-freeze

我移植了一个我写给PySide的PyQt4应用程序,但我无法为它创建一个可执行文件。我试图使用py2exe,cx_freeze和PyInstaller为PySide创建exe,前两个提供类似的错误(没有在构建期间提供错误报告,一切看起来都很好,直到我尝试运行exe) - PyQt4版本是freezable via py2exe。

系统信息

Windows 7,64位 - 所有软件都是使用软件包以下的32位版本:

  • Python 2.7.3 via 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.

FYI: MyApp.pyw的第11行=来自PySide的导入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"

我尝试了什么

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

  2. 将msvcr90.dll,msvcp90.dll,msvcm90.dll的副本放入Python / dll位置:我认为msvcp90.dll单独允许py2exe生成可操作的PyQt4 exe

  3. 使用pyside-rcc

  4. 重新编写所有qrc资源文件
  5. 将所有pyside / dll放入dist文件夹(py2exe)

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

  7. 重新安装所有python / modules,pyqt,pyside,VSE2008 C ++版,microsoft SDK,microsoft .netframe work 2.0 ?, Microsoft Visual C ++ 2008 Redistributable Package,

  8. 将所有正在进行的工作模块移植到包中但不在dir中

  9. 删除未成功移植/未连接的所有WIP模块

  10. 复制(手动不是setup.py)qt.conf(pyside中似乎不存在pyqt4?)和插件到dist文件夹

1 个答案:

答案 0 :(得分:3)

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

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

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

<强> NB:

from PySide import QtCore, QtGui

即使您的IDE说没有使用QtCore并且python运行模块没有问题,也总是需要。即使您可以在没有QtCore的情况下通过Python工作,也需要为该模块创建一个exe。

这不是制作主窗口的exe所需的,但是能够为模块创建操作exe是有帮助的。


转换计划结果

py2exe - 工作!

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

<强> cx_Freeze

一些作品,但行为不规律,并没有解释原因......

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

类似地,我有一个对话框,必须检索数据并在show()之前做一些计算......它什么都不做 - 不明白为什么。主窗口&amp;大多数程序都有效。

<强> PyInstaller

我可以为所有单个模块创建exe,但不能为主窗口模块创建exe。当我试图运行它时,我收到Ticket#590完全相同的问题,除了我正在使用pywin32-218&amp;没有熊猫。

当尝试运行此操作时:     ImportError:没有名为pythoncom的模块

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

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

PyInstaller的第二个问题

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

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

py2exe作为一个独立的应用程序不会出现上述情况。