使用Nuitka打包PyQt5应用后无法运行的问题求助
Nuitka打包PyQt5应用后报错找不到
fleep/data.json 问题详情
源码运行无异常,但使用Nuitka打包后执行报错,核心错误为:
📢 Tips: QFluentWidgets Pro is now released. Click https://qfluentwidgets.com/pages/pro to learn more about it. Traceback (most recent call last): File "C:\Users\18079\DOCUME~1\DOWNLO~1\MUSICD~1.DIS\MusicDownloader.py", line 4, in <module> File "<frozen importlib._bootstrap>", line 1176, in _find_and_load File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 690, in _load_unlocked File "C:\Users\18079\DOCUME~1\DOWNLO~1\MUSICD~1.DIS\window\main.py", line 6, in <module window.main> File "<frozen importlib._bootstrap>", line 1176, in _find_and_load File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 690, in _load_unlocked File "C:\Users\18079\DOCUME~1\DOWNLO~1\MUSICD~1.DIS\Interface\settings.py", line 11, in <module Interface.settings> File "<frozen importlib._bootstrap>", line 1176, in _find_and_load File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 690, in _load_unlocked File "C:\Users\18079\DOCUME~1\DOWNLO~1\MUSICD~1.DIS\helper\localmusicsHelper.py", line 9, in <module helper.localmusicsHelper> File "<frozen importlib._bootstrap>", line 1176, in _find_and_load File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 690, in _load_unlocked File "C:\Users\18079\DOCUME~1\DOWNLO~1\MUSICD~1.DIS\fleep\__init__.py", line 15, in <module fleep> FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\18079\\DOCUME~1\\DOWNLO~1\\MUSICD~1.DIS\\fleep\\data.json'
当前使用的打包命令:
nuitka --standalone --plugin-enable=pyqt5 --windows-icon-from-ico=icon.ico MusicDownloader.py
环境信息:
C:\Users\18079>nuitka --version 2.3.4 Commercial: None Python: 3.11.9 (tags/v3.11.9:de54cf5, Apr 2 2024, 10:12:12) [MSC v.1938 64 bit (AMD64)] Flavor: CPython Official Executable: C:\Users\18079\AppData\Local\Programs\Python\Python311\python.exe OS: Windows Arch: x86_64 WindowsRelease: 11 Nuitka-Scons: Non downloaded winlibs-gcc 'C:\Users\18079\Documents\mingw64\bin\gcc.exe' is being ignored, Nuitka is very Nuitka-Scons: dependent on the precise one. Version C compiler: ~\AppData\Local\Nuitka\Nuitka\Cache\DOWNLO~1\gcc\x86_64\13.2.0-16.0.6-11.0.1-msvcrt-r1\mingw64\bin\gcc.exe (gcc 13.2.0).
重装系统前可正常打包运行,目前无论是否使用管理员权限、在不同电脑上执行打包后的程序均报错。
解决方案
报错原因是Nuitka未自动识别并打包fleep库依赖的data.json资源文件,可通过以下方式解决:
1. 显式指定包含资源文件
修改打包命令,添加--include-data-files参数,指定源文件路径和打包后的目标路径(需替换为你实际的fleep安装路径):
nuitka --standalone --plugin-enable=pyqt5 --windows-icon-from-ico=icon.ico --include-data-files="C:\Users\18079\AppData\Local\Programs\Python\Python311\Lib\site-packages\fleep\data.json=fleep/data.json" MusicDownloader.py
格式说明:=左侧是本地Python环境中data.json的实际路径,右侧是打包后程序内的相对路径,需与fleep源码中读取文件的路径一致。
2. 修改fleep源码适配打包
找到fleep库的__init__.py文件,将原有的相对路径读取方式改为Python标准库的资源读取方式,让Nuitka能自动识别资源:
原代码(大概在第15行):
with open('data.json', 'r') as f: # 读取文件内容逻辑
修改为:
import importlib.resources # 直接读取资源内容 data_content = importlib.resources.read_text('fleep', 'data.json') # 后续使用data_content处理逻辑
修改后重新执行原打包命令即可。
3. 尝试通用包数据包含参数
如果fleep库的配置文件中已声明了包数据,可使用--include-package-data参数自动打包该库的所有资源:
nuitka --standalone --plugin-enable=pyqt5 --windows-icon-from-ico=icon.ico --include-package-data=fleep MusicDownloader.py
补充说明
重装系统后出现问题的可能原因:重装后Nuitka版本、Python环境发生变化,旧环境可能因版本特性自动处理了资源打包,新版本需要显式指定包含非代码类资源文件。
内容的提问来源于stack exchange,提问作者ChenMo
相关产品推荐
相关产品推荐

