cx_Freeze:导入错误:没有名为“PyQt5.Qt”的模块

3

我正在尝试使用 cx_Freeze 构建我的GUI应用程序。以下是 setup.py 的代码:

from cx_Freeze import setup, Executable
import os
import sys

base = None

if sys.platform == 'win32':
    base = 'Win32GUI'

exe = [Executable("main.py", base=base, icon='window_icon_XbH_icon.ico')]

os.environ['TCL_LIBRARY'] = r'C:\\Users\\dm\\AppData\\Local\\Programs\\Python\\Python36\\tcl\\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\\Users\\dm\\AppData\\Local\\Programs\\Python\\Python36\\tcl\\tk8.6'

options = {
'build_exe': {
    'includes': ['scipy.io', 'scipy.spatial.ckdtree'],

    'include_files': [r'C:\\Users\\dm\\AppData\\Local\\Programs\\Python\\Python36\\DLLs\\tcl86t.dll', r'C:\\Users\\dm\\AppData\\Local\\Programs\\Python\\Python36\\DLLs\\tk86t.dll',
                      r'C:\\Users\\dm\\AppData\\Local\\Programs\\Python\\Python36\\Lib\\site-packages\\pyqt5_tools\\platforms\\qwindows.dll', 'window_icon_XbH_icon.ico'],
    'packages': ['pkg_resources._vendor', 'pandas', 'numpy', 'scipy', 'pydub', 'PyQt5', 'soundfile', 'sounddevice', 'cffi'],
}
}

setup(name="app", version="1.0", description='To be added',
  options=options, executables=exe)

在构建过程中,cx_Freeze出现了以下错误。我已经安装了PyQt5。

running build
running build_exe
Traceback (most recent call last):
  File "setup.py", line 38, in <module>
options=options, executables=exe)
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\site-packages\cx_Freeze\dist.py", line 349, in setup
distutils.core.setup(**attrs)
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\distutils\core.py", line 148, in setup
dist.run_commands()
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\distutils\dist.py", line 955, in run_commands
self.run_command(cmd)
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\distutils\dist.py", line 974, in run_command
cmd_obj.run()
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\distutils\command\build.py", line 135, in run
self.run_command(cmd_name)
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\distutils\cmd.py", line 313, in run_command
self.distribution.run_command(command)
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\distutils\dist.py", line 974, in run_command
cmd_obj.run()
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\site-packages\cx_Freeze\dist.py", line 219, in run
freezer.Freeze()
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\site-packages\cx_Freeze\freezer.py", line 616, in Freeze
self.finder = self._GetModuleFinder()
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\site-packages\cx_Freeze\freezer.py", line 342, in _GetModuleFinder
finder.IncludePackage(name)
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\site-packages\cx_Freeze\finder.py", line 659, in IncludePackage
module = self._ImportModule(name, deferredImports)
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\site-packages\cx_Freeze\finder.py", line 351, in _ImportModule
raise ImportError("No module named %r" % name)
ImportError: No module named 'PyQt5.Qt'

能否有人帮助我找出实际上出了什么问题?


你使用的cx_Freeze版本是哪个? - jpeg
@jpeg 最新版本。cx_Freeze 5.1.1 - user8026974
3个回答

3
不要将 PyQt5 大写。在 setup.py 文件中使用 pyqt5。

1

我知道这是一个老问题,但今天我遇到了这个问题。

这是我解决它的方法:

从我的setup.py('{"build_exe": {"packages":'<- 这部分)中删除PyQt5和所有相关内容。 然后编译我的exe。 如果运行exe并出现缺少PyQt5模块错误,则从您的site-packages目录 (路径类似于这个:d:\Python37\Lib\site-packages\PyQt5\) 将整个PyQt5目录复制到您的cx_freeze构建的lib目录(例如:..\build\exe.win-amd64-3.7\lib\)

现在尝试运行exe,应该没有缺少模块错误,至少与PyQt5相关。 如果您有任何其他缺少模块问题,那么只需将其从site-packages复制到lib目录即可。希望能帮到你。


0
尝试移除(不必要的?)行。
import PyQt5.Qt

从你的setup.py脚本中。

在OP删除这行后进行编辑:

  1. 尝试删除不必要的os.environ语句,这些是为了tkinter而存在的,可能会产生冲突。在include_files中删除3个DLL条目(仅保留图标)。将'atexit'添加到includes列表中,请参见cx_Freeze PyQt5 example

  2. 尝试重新安装PyQt5cx_Freeze,请参见ImportError: No module named PytQt5PyQt5 and QtGui module not found中的潜在注意事项。

  3. 如果仍然无法解决问题,可能与应用程序中使用的其他软件包存在冲突。为了找出原因,请使用仅使用PyQt5的最小示例,例如cx_Freeze PyQt5 example并尝试冻结它。如果可以正常工作,请逐步添加其他软件包,并在每个步骤中检查冻结的应用程序。

编辑 II:

  1. 另外一个可能性是,如果您的系统上安装了PyQt4,则可能会与之发生冲突。请确保从应用程序中删除任何有关PyQt4的导入,并在setup.py脚本的build_exe字典中添加一个条目excludes:['PyQt4']

我不知道为什么cx_Freeze无法找到PyQt5。 - user8026974
如果你在Python控制台中输入“import PyQt5.Qt”,会发生什么? - jpeg
@M.Denis,我已经在我的答案中添加了更多的建议。 - jpeg
完整的回溯是什么?哪个 DLL 应该提供未找到的函数?尝试将此 DLL 添加到您的分发目录或其 lib 子目录中。您的 GUI 是基于 PyQt5 还是其他 GUI 库?如果是,您是否尝试在主应用程序脚本中添加 import PyQt5 - jpeg
我仍在努力弄清楚这个问题。但我确定这是一个版本冲突。上周我能够冻结应用程序,现在我不能了,因为我重新安装了操作系统。 - user8026974
显示剩余3条评论

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