No module named PyQt5

背景:将Python文件转成APP,在编辑器中运行没有问题,一使用pyinstaller转成app就报错了

尝试了各种网上的解法都无效,最后是GPT4解决的

Q:

我遇到一个奇怪的问题,我在python文件中,引用了pyqt5的相关模块,例如:from PyQt5 import QtWidgets,我已经安装了PyQt5,并且在运行此脚本时,可以正常运行,但当我使用pyinstaller windowed myapp.py,这个指令之后,打包出来的myapp.app就始终会闪退,我又运行了同时生成的可执行文件,我看到终端里有这样的报错:
Traceback (most recent call last):
File "main.py", line 1, in
from PyQt5 import QtWidgets
ModuleNotFoundError: No module named 'PyQt5'
[87019] Failed to execute script 'main' due to unhandled exception: No module named 'PyQt5'
[87019] Traceback:
Traceback (most recent call last):
File "main.py", line 1, in
from PyQt5 import QtWidgets
ModuleNotFoundError: No module named 'PyQt5'

这是为什么呢?

A:

这个问题可能是由于PyInstaller在打包应用时没有正确地包含PyQt5模块。要解决这个问题,你可以尝试以下几个步骤:

1. 创建一个名为`hook-PyQt5.py`的文件,并将其放在你的项目目录中。在这个文件中,写入以下内容:

```python
from PyInstaller.utils.hooks import collect_submodules, collect_data_files

hiddenimports = collect_submodules('PyQt5')
datas = collect_data_files('PyQt5', include_py_files=True)
```

这段代码将告诉PyInstaller收集所有与PyQt5相关的子模块和数据文件。

2. 在你的项目目录中,创建一个名为`myapp.spec`的文件。将以下内容写入这个文件:

# myapp.spec

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(['myapp.py'],
             pathex=['/path/to/your/project'],
             binaries=[],
             datas=[],
             hookspath=['.'],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='myapp',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=False,
          icon=None)
app = BUNDLE(exe,
             name='myapp.app',
             icon=None,
             bundle_identifier=None)

请确保将`/path/to/your/project`替换为你的项目目录的实际路径。

3. 使用以下命令重新构建和打包你的应用:

pyinstaller --clean myapp.spec

这将使用`myapp.spec`文件中的设置来运行PyInstaller,从而确保PyQt5模块被正确地包含在打包的应用中。

4. 在`dist`目录中找到生成的`myapp.app`或`myapp.exe`(取决于你的操作系统),然后尝试运行它。现在,应用程序应该不再闪退,并且能够正常运行。

Q:

我按照你的步骤,pyQt的问题解决了,现在它有了另一个报错,
Traceback (most recent call last):
  File "main.py", line 1, in
  File "PyInstaller/loader/pyimod02_importers.py", line 352, in exec_module
  File "PyQt5/__init__.py", line 20, in
ModuleNotFoundError: No module named 'pkgutil'
[99055] Failed to execute script 'main' due to unhandled exception: No module named 'pkgutil'
[99055] Traceback:
Traceback (most recent call last):
  File "main.py", line 1, in
  File "PyInstaller/loader/pyimod02_importers.py", line 352, in exec_module
  File "PyQt5/__init__.py", line 20, in
    __path__ = __import__('pkgutil').extend_path(__path__, __name__)
ModuleNotFoundError: No module named 'pkgutil'

A:

这个错误表明`pkgutil`模块在打包的应用程序中未找到。`pkgutil`是Python的一个内置模块,通常不应该出现这个问题。但是,我们可以通过更新`myapp.spec`文件来解决这个问题。

在`myapp.spec`文件中,找到`Analysis`部分,将`pkgutil`添加到`hiddenimports`列表中。修改后的`Analysis`部分应如下所示:

a = Analysis(['myapp.py'],
             pathex=['/path/to/your/project'],
             binaries=[],
             datas=[],
             hookspath=['.'],
             runtime_hooks=[],
             excludes=[],
             hiddenimports=['pkgutil'],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)

保存更改,然后重新运行`pyinstaller --clean myapp.spec`命令以构建和打包应用程序。现在,你的应用程序应该能够正常运行,而不会出现`ModuleNotFoundError: No module named 'pkgutil'`的错误。

成功运行!(这个是官网的示例,之前我的代码一直有问题,为了排除是我自己的问题,就用了官网示例来测试,发现问题一直,才继续往下解决的,官网地址:Packaging PyQt5 applications into a macOS app with PyInstaller)

No module named PyQt5_第1张图片

 

你可能感兴趣的:(qt,python,开发语言)