使用cx_Freeze打包PySide6项目为可执行文件后无法启动的求助
PySide6 + cx_Freeze 打包问题求助
版本信息
- PySide6: 6.6.1
- shiboken6: 6.6.1
- cx_Freeze: 6.15.14
我的cx_Freeze打包代码
import sys from cx_Freeze import setup, Executable files = ["music.mp3", "logo.png", "main.ui", "myfolder"] build_exe_options = { "packages": ["os"], "include_files": files } # base="Win32GUI" base = "Win32GUI" if sys.platform == "win32" else None setup( name="my app", version="1.0", description="my app", options={"build_exe": build_exe_options}, executables=[Executable("main.py", base=base)], )
我按照官方文档操作,但始终遇到错误(错误截图:错误界面截图)。我尝试将shiboken6.abi3.dll添加到include_files中:
files = ["music.mp3", "logo.png", "main.ui", "myfolder" ,"..\myenv\Lib\site-packages\shiboken6\shiboken6.abi3.dll"]
但问题依旧,请问该如何解决,或有其他方法打包PySide6项目并包含所需文件夹?
解决方案
方法1:修复cx_Freeze的依赖扫描逻辑
cx_Freeze有时无法自动识别PySide6的完整依赖,可做以下调整:
- 显式声明PySide6相关包:在
build_exe_options的packages里加入PySide6和shiboken6,强制cx_Freeze扫描完整依赖链:
build_exe_options = { "packages": ["os", "PySide6", "shiboken6"], "include_files": files }
- 用绝对路径添加DLL:手动添加DLL时,避免相对路径解析错误,用
os.path拼接绝对路径:
import os shiboken_dll = os.path.join(sys.exec_prefix, "Lib", "site-packages", "shiboken6", "shiboken6.abi3.dll") files = ["music.mp3", "logo.png", "main.ui", "myfolder", shiboken_dll]
方法2:改用PyInstaller(更稳定的PySide6打包工具)
如果cx_Freeze的问题始终无解,PyInstaller对PySide6的支持更成熟,步骤如下:
- 安装PyInstaller:
pip install pyinstaller - 执行打包命令(Windows环境):
pyinstaller --onefile --windowed --add-data "music.mp3;." --add-data "logo.png;." --add-data "main.ui;." --add-data "myfolder;myfolder" main.py
--onefile:生成单个可执行文件--windowed:隐藏控制台窗口(对应cx_Freeze的Win32GUI)--add-data:格式为源路径;目标路径,Linux/macOS需把;换成:
方法3:手动添加Qt插件目录
错误大概率是Qt插件加载失败,cx_Freeze需要明确包含Qt的插件目录:
- 找到PySide6的plugins目录(一般在
site-packages/PySide6/plugins) - 将整个plugins目录以元组形式添加到
include_files,保证打包后路径结构正确:
import os plugins_dir = os.path.join(sys.exec_prefix, "Lib", "site-packages", "PySide6", "plugins") files = ["music.mp3", "logo.png", "main.ui", "myfolder", (plugins_dir, "plugins")]
内容的提问来源于stack exchange,提问作者randompersonhehe
相关产品推荐
相关产品推荐

