PyInstaller打包PyQt5程序报错:属性错误与插件目录未找到
解决PyQt5 + PyInstaller打包时的三类常见错误
你从PyQt4迁移到PyQt5后用PyInstaller打包遇到的这几个问题其实挺常见的,我来给你逐个拆解解决:
问题回顾
你遇到的具体错误包括:
AttributeError: module 'enum' has no attribute 'IntFlag'ModuleNotFoundError: No module named 'sip'Exception: Cannot find PyQt5 plugin directories
对应的完整回溯信息如下:
Traceback (most recent call last): File "<string>", line 2, in <module> ModuleNotFoundError: No module named 'sip' Traceback (most recent call last): File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python36_64\Scripts\pyinstaller-script.py", line 11, in <module> load_entry_point('PyInstaller==3.4.dev0+ab8fd9753', 'console_scripts', 'pyinstaller')() File "c:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\PyInstaller\__main__.py", line 94, in run run_build(pyi_config, spec_file, **vars(args)) File "c:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\PyInstaller\__main__.py", line 46, in run_build PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs) File "c:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\PyInstaller\building\build_main.py", line 791, in main build(specfile, kw.get('distpath'), kw.get('workpath'), kw.get('clean_build')) File "c:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\PyInstaller\building\build_main.py", line 737, in build exec(text, spec_namespace) File "<string>", line 16, in <module> File "c:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\PyInstaller\building\build_main.py", line 213, in __init__ self.__postinit__() File "c:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\PyInstaller\building\datastruct.py", line 161, in __postinit__ self.assemble() File "c:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\PyInstaller\building\build_main.py", line 472, in assemble module_hook.post_graph() File "c:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\PyInstaller\building\imphook.py", line 410, in post_graph self._load_hook_module() File "c:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\PyInstaller\building\imphook.py", line 377, in _load_hook_module self.hook_module_name, self.hook_filename) File "c:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\PyInstaller\compat.py", line 744, in importlib_load_source return mod_loader.load_module() File "<frozen importlib._bootstrap_external>", line 399, in _check_name_wrapper File "<frozen importlib._bootstrap_external>", line 823, in load_module File "<frozen importlib._bootstrap_external>", line 682, in load_module File "<frozen importlib._bootstrap>", line 265, in _load_module_shim File "<frozen importlib._bootstrap>", line 684, in _load File "<frozen importlib._bootstrap>", line 665, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 678, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "c:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\PyInstaller\hooks\hook-PyQt5.QtCore.py", line 15, in <module> binaries = qt_plugins_binaries('codecs', namespace='PyQt5') File "c:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\PyInstaller\utils\hooks\qt.py", line 65, in qt_plugins_binaries pdir = qt_plugins_dir(namespace=namespace) File "c:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\PyInstaller\utils\hooks\qt.py", line 39, in qt_plugins_dir raise Exception('Cannot find {0} plugin directories'.format(namespace)) Exception: Cannot find PyQt5 plugin directories
逐个解决错误
1. 解决AttributeError: module 'enum' has no attribute 'IntFlag'
这个问题几乎都是因为你安装了第三方的enum34包,和Python3.6+自带的enum模块冲突了(Python3.6及以上版本已经内置了enum.IntFlag)。
解决步骤:
打开命令行执行:
pip uninstall -y enum34
卸载后重启你的Python环境,再尝试打包即可。
2. 解决ModuleNotFoundError: No module named 'sip'
在新版PyQt5中,sip已经成为一个独立的依赖包,PyInstaller有时候无法自动识别它。
解决步骤:
- 首先确保你已经安装了
sip:
pip install sip
- 如果安装后还是报错,打包时手动指定隐藏导入:
pyinstaller --hidden-import sip your_script.py
或者你可以编辑生成的.spec文件,在Analysis部分的hiddenimports列表里添加sip:
a = Analysis(['your_script.py'], ... hiddenimports=['sip'], ...)
3. 解决Exception: Cannot find PyQt5 plugin directories
这个问题通常是因为PyInstaller版本过旧,或者无法正确定位PyQt5的插件目录。
解决步骤:
- 先升级PyInstaller到最新稳定版:
pip install --upgrade pyinstaller
(你当前用的是PyInstaller==3.4.dev0,这个开发版bug较多,升级到正式版大概率能解决)
- 如果升级后还是不行,手动指定PyQt5的插件路径:
- 先找到你PyQt5的插件目录,通常在Python的site-packages文件夹下的
PyQt5\plugins,比如你的路径可能是c:\program files (x86)\microsoft visual studio\shared\python36_64\lib\site-packages\PyQt5\plugins - 打包时用
--add-data参数(Windows用分号分隔路径,Linux/macOS用冒号):
pyinstaller --add-data "C:\path\to\PyQt5\plugins;PyQt5\plugins" your_script.py- 或者编辑
.spec文件,添加插件目录到datas:
from PyInstaller.utils.hooks import qt_plugins_dir plugin_path = qt_plugins_dir('PyQt5') a = Analysis(['your_script.py'], datas=[(plugin_path, 'PyQt5/plugins')], ...) - 先找到你PyQt5的插件目录,通常在Python的site-packages文件夹下的
按照这个顺序逐个解决,应该就能顺利打包了。
内容的提问来源于stack exchange,提问作者주영준
相关产品推荐
相关产品推荐

