MacOS下PyInstaller打包PySide6 QtWebEngine程序启动失败求助
问题背景
基于PySide6的Python GUI程序在PyCharm中运行正常,但在macOS(系统默认Python3.9,项目使用Python3.8)环境下,执行命令pyinstaller --onefile test1.py打包成单文件可执行程序后,启动时报错无法找到Qt WebEngine资源。
简化测试代码(可复现问题):
import sys from PySide6 import QtGui, QtCore, QtWidgets, QtWebEngineWidgets app = QtWidgets.QApplication() q = QtWebEngineWidgets.QWebEngineView() q.load(QtCore.QUrl('https://www.google.com/')) q.show() sys.exit(app.exec())
启动错误信息:
Sandboxing disabled by user.
The following paths were searched for Qt WebEngine resources:/var/folders/l9/985bkq8n0kq97vpvhp4clxvw0000gn/T/_MEIhWjxll/PySide6/Qt/resources
/var/folders/l9/985bkq8n0kq97vpvhp4clxvw0000gn/T/_MEIhWjxll/PySide6/Qt
/Users/duygu/PycharmProjects/fiver_converting
/Users/duygu/.timezone_app
but could not find any.
You may override the default search paths by using QTWEBENGINE_RESOURCES_PATH environment variable.
zsh: abort /Users/duygu/PycharmProjects/fiver_converting/timezone_app
解决方案
方法1:修改.spec文件手动添加资源路径
- 生成spec文件(若已生成可跳过此步):
pyinstaller --onefile test1.py
- 打开生成的
test1.spec文件,在Analysis模块的datas列表中添加Qt WebEngine资源目录映射。替换示例中的路径为你虚拟环境下的实际路径:
a = Analysis( ... datas=[('/Users/duygu/PycharmProjects/fiver_converting/venv/lib/python3.8/site-packages/PySide6/Qt/resources', 'PySide6/Qt/resources')], ... )
- 用修改后的spec文件重新打包:
pyinstaller test1.spec
方法2:打包命令直接指定资源路径
无需修改spec文件,通过--add-data参数直接将资源目录包含进打包文件:
pyinstaller --onefile --add-data "/Users/duygu/PycharmProjects/fiver_converting/venv/lib/python3.8/site-packages/PySide6/Qt/resources:PySide6/Qt/resources" test1.py
注:macOS下路径分隔符用冒号:,Windows系统需替换为分号;
方法3:临时设置环境变量(仅用于测试)
若仅需临时验证程序功能,可在启动可执行文件前设置环境变量指定资源路径:
QTWEBENGINE_RESOURCES_PATH="/Users/duygu/PycharmProjects/fiver_converting/venv/lib/python3.8/site-packages/PySide6/Qt/resources" ./dist/test1
此方法仅适合本地测试,不适合分发程序
额外注意事项
- 升级PyInstaller到最新版本:旧版本对PySide6 WebEngine的支持可能存在缺陷,执行
pip install --upgrade pyinstaller完成升级 - 单文件打包时,PyInstaller会将资源解压到系统临时目录,需确保资源路径在打包时被正确映射,避免路径引用错误
内容的提问来源于stack exchange,提问作者hobik

