python pyinstaller 打包

安装

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

常见踩坑点

  1. 换行符别混用:CMD用^,PowerShell用` ,混用会报命令语法错误。
  2. 参数顺序:参数写在入口脚本(run.py)前面。
  3. 不要过度使用hidden-import:大量动态模块优先用--collect-submodules,一个个手写hidden-import维护麻烦。

原文出处:/show_1EF6EBkunKAu.html