在Windows 7中使用cx_freeze创建的可执行文件在其他计算机上运行时因PyQt5错误而崩溃



可执行文件在我构建它的系统上完美运行,但在我尝试过的其他系统上崩溃并出现以下错误…

Traceback(most recent call last):
File "C:Python34libsite-packagescx_freeze-4.3.3-py3.4-win32.eggcx_freezeinitscriptsConsole.py", line 27, in <module>
File "monitor edi.py", line 1, in <module>
File "C:Python34libimportlib_bootstrap.py", line 2214, in find and load
File "C:Python34libimportlib_bootstrap.py", line 2203, in find and load_unlocked
File "C:Python34libimportlib_bootstrap.py", line ll91, in load unlocked
File "C:Python34libimportlib_bootstrap. py", line l l 6 l , in _load_backward_compatible
File "C:AppscarsCodecars utils.py", line 7, in <module>
File "C:Python34libimportlib_bootstrap.py", line 2261, in handle fromlist
File "C:Python34libimportlib_bootstrap.py", line 321, in call with frames_removed
File "C:Python34libimportlib_bootstrap.py", line 2214, in find and load
File "C:Python34libimportlib_bootstrap.py", line 2203, in find and load_unlocked
File "C:Python34libimportlib_bootstrap.py", line ll91, in load unlocked
File "C:Python34libimportlib_bootstrap.py", line ll61, in load_backward_compatible
File "ExtensionLoader_PyQt5_QtCore.py", line 22, in <module>
File "ExtensionLoader_PyQt5_QtCore.py", line 14, in  __bootstrap__
ImportError: DLL load failed: The specified module could not be found.

我读过一些缺失的DLL问题,如QWindows.DLL和libEGL.dll,但它看起来像cx_Freeze-4.3.3已经修复了这些问题,因为这些DLL包含在构建文件夹中。

内置在32位Python 3.4, PyQt 5.3和cx_Freeze 4.3.3

下面是构建文件夹

中的文件列表
icudt49.dll
icuin49.dll
icuuc49.dll
libEGL.dll
libGLESv2.dll
library.zip
monitor_edi.exe
msvcr100.dll
pyexpat.pyd
pyodbc.pyd
PyQt5.QtCore.pyd
PyQt5.QtGui.pyd
PyQt5.QtWidgets.pyd
python34.dll
pywintypes34.dll
Qt5Core.dll
Qt5Gui.dll
Qt5Widgets.dll
qwindows.dll
select.pyd
sip.pyd
tcl86t.dll
tk86t.dll
unicodedata.pyd
win32api.pyd
win32crypt.pyd
_bz2.pyd
_ctypes.pyd
_decimal.pyd
_hashlib.pyd
_lzma.pyd
_socket.pyd
_ssl.pyd
_tkinter.pyd

想法/建议/问题吗?

您需要确保cx_Freeze包含atexit模块。我不是很清楚为什么会这样,但是cx_Freeze PyQt示例包含了这个。如果您使用的是cxfreeze脚本,则可以使用--include=atexit选项确保发生这种情况。如果您从自己的setup.py脚本中调用cx_Freeze,它可能看起来类似于以下代码,这些代码改编自我自己正在进行的工作:

import sys
from cx_Freeze import setup, Executable
base = None
if sys.platform == 'win32':
    base = 'Win32GUI'
setup(name = 'spamandeggs',
      version = '0.0.1',
      executables = [Executable('spamandeggs.pyw', base=base)],
      options = {'build_exe': {'includes': ['atexit']}})

如果你正在使用PyQt5.Qsci插件,顺便说一下,你还需要显式地包括PyQt5.QtPrintSupport。我发现我仍然需要在cx_Freeze完成它的东西后复制libEGL.dll,但我也在使用cx_Freeze 4.3.3,所以我不知道为什么会这样。

我今天得到了同样的错误,经过一整天的搜索,终于为我找到了解决方案。我复制了msvcp100.dll,一切正常。

wft

相关内容