安装 PyInstaller
确保 your.py
是你的主入口文件,而其他模块和资源也需要在打包时一起包含。
基本打包命令
使用 PyInstaller 打包最基本的命令如下:
pyinstaller --name YourpyName --onefile your.py
-
--onefile
参数告诉 PyInstaller 将所有内容打包到一个独立的二进制文件中。 - 最终生成的可执行文件会放在
dist/
目录下。 - name 是打包后的名称
打包多文件和资源
项目中往往包含一些非 Python 文件,如配置文件、图片等。这些文件需要在打包时一起捆绑,以便在运行时访问。
使用 --add-data
参数可以将外部文件打包进去。格式如下:
pyinstaller --onefile --add-data "source_path;destination_path" your.py
注意:
在 Windows 中,源路径和目标路径使用分号 ;
分隔
在 Linux 和 macOS 中,使用冒号 :
分隔。
输出目录
-
PyInstaller 默认生成两个文件夹:
-
build/
: 临时构建文件。 -
dist/
: 最终输出的 EXE 文件。
-
查看生成的 .spec
文件
首次运行后会生成 YourAppName.spec
文件,检查其中配置是否正确:
Spec 文件是 PyInstaller 打包的配置文件,默认情况下,PyInstaller 在每次打包时自动生成一个 .spec
文件。你可以手动生成或编辑这个文件以实现更高级的配置。
生成 Spec 文件后,你可以根据需要编辑其中的设置,然后通过以下命令再次打包:
pyinstaller my_app_name.spec
常见问题
文件路径找不到
- 问题原因: 打包后的可执行文件运行时,文件路径会变为临时路径,直接使用相对路径可能会找不到文件。
- 解决方案: 使用
sys._MEIPASS
定位打包后的临时目录,确保文件路径正确。
打包后的文件过大
- 问题原因: PyInstaller 会将所有依赖库打包进可执行文件,导致文件较大。
- 解决方案: 可以通过
--exclude-module
参数排除不需要的模块,或使用--onefile
选项减少冗余文件。
运行时出现缺少依赖
- 问题原因: PyInstaller 在某些情况下无法自动检测到所有依赖项。
- 解决方案: 使用hidden-import 选项手动指定依赖模块,例如:
pyinstaller --onefile --hidden-import module_name main.py
(xxx) root@45xxxx:/xxxx/dist/xxx# ./xx --weights weights/best.pt --imgsz 640
报错:ModuleNotFoundError: No module named 'importlib.metadata'
-
Python 版本兼容性:
-
importlib.metadata
是 Python 3.8+ 的标准库模块。 -
如果你的 Python 版本是 3.7 或更低,重新安装python3.8+以及对应的依赖。
-
-
PyInstaller 未正确打包依赖:
-
即使安装了
importlib-metadata
,PyInstaller 也可能未自动检测到此依赖。
-
解决方案
1. 安装 importlib-metadata
包
pip install importlib-metadata
2. 在 .spec
文件中添加 hiddenimports
a = Analysis(
['detect.py'],
pathex=['/home/common-dir/xxx'],
binaries=[],
datas=[
('models/**/*', 'models'),
('ultralytics/cfg/**/*', 'ultralytics/cfg'),
('weights/**/*', 'weights')
],
hiddenimports=[
'importlib.metadata', # 添加此行
'models'
],
...
)
3. (可选)升级 Python 到 3.8+
-
如果升级 Python 可行,直接使用内置的
importlib.metadata
。
清理并重新打包:
# 清理旧构建
rm -rf build/ dist/
del YourAppName.spec
pyinstaller xxx.spec
验证生成的可执行文件:
cd /home/common-dir/xxx/dist/SOMI/
./xxx --weights weights/best.pt --imgsz 640 --name xxx
其他可能的问题
PyInstaller 版本过旧:
pip install --upgrade pyinstaller
系统路径问题
-
确保打包时使用的 Python 环境与当前激活的环境一致。
报错:FileNotFoundError: [Errno 2] No such file or directory: '/home/common-dir/xxx/dist/xx/_internal/utils/torch_utils.pyc'
[PYI-74787:ERROR] Failed to execute script 'detect' due to unhandled exception!
找到你utils/torch_utils.py文件,复制副本,修改副本的后缀名,改成utils/torch_utils.pyc,直接拷贝到对应的dist文件目录下
注意:linux系统下生成的不是exe文件,是一个没有拓展名的文件