安装
pip install pyinstaller
打包命令
pyinstaller.exe -F -w -i d:\ico\one.ico homework.py --hidden-import xlrd,xlwt
参数:
- -F 生成一个的可执行程序(启动较慢,不推荐)
- -i 指定程序的图标
- -w 不显示dos窗口,桌面程序推荐加此参数
- -c 显示dos窗口(命令行)
例子-桌面程序打包
在该文件所在目录下,执行下面命令:
pyinstaller -w 1.py
结果
在 dist 文件夹下,有多个 文件,其中有一个是 exe 启动文件,双击可启动,不显示黑色命令窗口
注意:桌面程序,运行报错时,可能不会弹出错误,此时打包时不要加 -w 参数,启动程序会弹出桌面程序 和 命令窗口,错误信息会显示在 命令窗口中
例子-控制台程序
python代码
创建 1.py 文件,内容如下:
print("测试")
打包
在该文件所在目录下,执行下面命令:
pyinstaller -F 1.py
结果
在 dist 文件夹下,有 1.exe 文件
在控制台中运行该文件,控制台显示如下:
测试
—collect-submodules 与 —hidden-import 参数
fastapi项目,使用字符串 "app.main:app" 形式,如下:
uvicorn.run(
app="app.main:app",
host=host,
port=port,
log_level="info"
)
PyInstall 静态 AST 扫描根本读不到这个导入,靠默认分析一定抓不到 app.main,必须靠:--collect-submodules app + --hidden-import app.main 才能把模块收集进去。
打包到 .exe 中
1. --collect-submodules app
作用:递归收集app包下所有子Python模块,强制打包进去,不受PyInstaller静态代码分析限制。
适用场景:
- 项目是包结构(
app/__init__.py、app/main.py等) - 代码存在动态导入模块,静态分析扫不到子模块
- FastAPI、Flask后端项目
注意:只收集.py代码模块,不会自动收集静态资源、二进制文件。如果需要一并收集资源文件,改用--collect-all app。
2. --hidden-import app.main
作用:手动声明隐式导入模块,告诉PyInstaller代码里动态import了app.main,强制把这个模块打包。
适用场景:
- 通过字符串动态导入模块
importlib.import_module("app.main") - 框架内部动态加载,静态AST无法识别导入关系
补充
已经写了--collect-submodules app,app.main一般已经被自动收集;保留--hidden-import可以作为兜底,防止特殊场景漏包。
Windows CMD(换行符:^)
pyinstaller -F ^
--collect-submodules app ^
--hidden-import app.main ^
run.py
参数解释:
-F:打包成单个exe文件,方便分发- 去掉
-w:保留控制台黑窗口,方便查看程序日志、报错信息(后端服务不建议加-w)
Windows PowerShell(换行符:` 反引号)
pyinstaller -F `
--collect-submodules app `
--hidden-import app.main `
run.py
常见踩坑点
- 换行符别混用:CMD用
^,PowerShell用`,混用会报命令语法错误。 - 参数顺序:参数写在入口脚本(run.py)前面。
- 不要过度使用hidden-import:大量动态模块优先用
--collect-submodules,一个个手写hidden-import维护麻烦。