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

Posted

技术标签:

【中文标题】在 Windows 7 中使用 cx_freeze 创建的可执行文件在其他计算机上运行时崩溃并出现有关 PyQt5 的错误【英文标题】:Executable created using cx_freeze in Windows 7 crashes with errors about PyQt5 when run on other computers 【发布时间】:2014-06-10 08:10:34 【问题描述】:

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

Traceback(most recent call last):
File "C:\Python34\lib\site-packages\cx_freeze-4.3.3-py3.4-win32.egg\cx_freeze\initscripts\Console.py", line 27, in <module>
File "monitor edi.py", line 1, in <module>
File "C:\Python34\lib\importlib\_bootstrap.py", line 2214, in find and load
File "C:\Python34\lib\importlib\_bootstrap.py", line 2203, in find and load_unlocked
File "C:\Python34\lib\importlib\_bootstrap.py", line ll91, in load unlocked
File "C:\Python34\lib\importlib\_bootstrap. py", line l l 6 l , in _load_backward_compatible
File "C:\Apps\cars\Code\cars utils.py", line 7, in <module>
File "C:\Python34\lib\importlib\_bootstrap.py", line 2261, in handle fromlist
File "C:\Python34\lib\importlib\_bootstrap.py", line 321, in call with frames_removed
File "C:\Python34\lib\importlib\_bootstrap.py", line 2214, in find and load
File "C:\Python34\lib\importlib\_bootstrap.py", line 2203, in find and load_unlocked
File "C:\Python34\lib\importlib\_bootstrap.py", line ll91, in load unlocked
File "C:\Python34\lib\importlib\_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

有什么想法/建议/问题吗?

【问题讨论】:

尝试在解冻的程序上使用listdlls,看看哪些 Qt DLL 没有被包含。 Dependency walker 在这里也可能派上用场。 我尝试了提到 python3.dll 的 Dependency Walker。但是,添加该 dll 根本没有改变错误消息。 Dependency walker 的输出包括此消息 ****LoadLibraryExW("g:\share\exe.win32-3.4\PyQt5.QtCore.pyd", 0x00000000, LOAD_WITH_ALTERED_SEARCH_PATH) 返回 NULL。错误:找不到指定的模块 (126)。 **** 那是 PyQt5.QtCore.pyd 的正确路径 【参考方案1】:

您需要确保 cx_Freeze 包含 atexit 模块。我不太清楚为什么会这样,但the cx_Freeze PyQt example 包括了这个。如果您使用的是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,所以我不确定为什么会这样。

【讨论】:

【参考方案2】:

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

wft

【讨论】:

以上是关于在 Windows 7 中使用 cx_freeze 创建的可执行文件在其他计算机上运行时崩溃并出现有关 PyQt5 的错误的主要内容,如果未能解决你的问题,请参考以下文章

CX_Freeze 和 guiqwt 适用于 windows 而不是 linux

我正在尝试使用 cx_Freeze (windows) 将 PyEnchant 库包含到我的 exe 文件中

Windows XP 中的 Python Cx_Freeze 错误

如何在 Windows 10 上使用 Cx_Freeze 制作 exe,包括 PyQt5 和 OpenCV

使用 Python 3.2 和 cx_Freeze 创建 Windows 可执行文件

cx_freeze 一个包含 Dropbox 的 Python 脚本