Nuitka 打包详解
Current Python Version: 3.10.11
准备
- gcc
- MingW64
安装Nuitka
pip install nuitka
参数
--standalone
生成一个标准的可执行文件,但是注意程序依赖的dll
动态库,也会生成,如果程序依赖的库文件在系统中找不到,执行时会报错。如果采用此方案打包,可以最后使用upx
进行压缩
--onefile
打包成一个可执行文件,这个文件中包含Python解析器以及依赖的其他库,是一个绿色
的可执行程序,该文件不依赖任何外部程序
--include-data-file
包含额外的静态资源文件
--include-module
包含模块
-o
设置输出目录
优化和调试
--deep
进行深入的优化
--no-cache
禁用编译缓存
--debug
生成调试信息
--nofollow-imports
排除哪些不需要的模块,减少打包大小
--icon
自定义图标
提高打包速度
--remove-output
删除临时构建的文件,能够节省磁盘空间,加快构建速度
--lto
启用连接时优化,进一步优化二进制文件体积和性能
--jobs=4
提高并发处理速度
--nofollow-imports
避免Nuitka 跟踪不必要的模块依赖导入,从而减少编译时间,尤其当你的项目依赖大量模块时
分阶段打包
- 先将核心模块编译成.pyd文件,然后将这些.pyd文件与其他代码一起打包,这样提高打包成功率
避免打包单文件
- 打包单文件会增加,编译时间
使用批处理
脚本自动化执行
打包fastapi应用
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
# main.py
if __name__ == "__main__":
import uvicorn
uvicorn.run("main:app", host="0.0.0.0", port=8000)
打包命令
python -m nuitka --nofollow-imports --standalone --include-module=uvicorn --jobs=4 --include-module=fastapi --include-module=main --output-dir=./output --onefile main.py
注意:一定要包含--include-module=main
要不然白打包了
脚本打包
#!/bin/bash
MODULES="click pydantic fastapi uvicorn redis sqlalchemy pymysql openpyxl websockets"
modules_array=($MODULES)
params = ""
for module in "${modules_array[@]}";do
params+=" --include-module=${module}"
done
function clear_build() {
echo "正在清除打包程序..."
rm -rf output/
echo "清除完成"
}
function build_exe(){
echo "正在执行exe打包程序..."
python -m nuitka --nofollow-imports --standalone ${params} --jobs=4 --include-module=main --output-dir=./output --onefile main.py
echo "exe文件打包完成"
}
case "$1" in
clear)
clear_build
;;
build)
# build_py_package
build_exe
;;
*)
echo "用法: $0 {clear|build}"
echo
echo "clear: 清除打包程序"
echo "build: 执行exe打包程序"
exit 1
;;
esac
exit 0