Python 进行代码打包的工具。如:
pyinstaller:将 Python 程序转换成独立的执行文件(跨平台)py2exe:问题相对较多,貌似是 python2 的,只有 Windows 的,OUT
gooey:号称一条命令将命令行程序变成 gui 程序Nuitka:将脚本、模块、包编译成可执行文件或扩展模块pynsist:一个用来创建 Windows 安装程序的工具,可以在安装程序中打包 Python 本身。
概述
pyinstaller
pyinstaller:将 Python 程序转换成独立的执行文件(跨平台)
py2exe:问题相对较多,貌似是 python2 的,只有 Windows 的,OUT
cx_freeze:将 python 程序转换为带有一个动态链接库的可执行文件。
bbfreeze:Released: Jan 21,2014。OUT
- 与 nuitka 比较
- 环境配置:nuitka 还要搞一堆环境:mingw、ccache
- 跨平台性:都可
- 文档:pyinstaller 胜
- 流行度:pyinstaller 胜
- 安全性:pyinstaller –key,nuitak 编译成 C 语言级别的,胜
- 问题:nuitka 问题多多
- 打包大小:pyinstaller 胜
- 启动速度:nuitka 胜
- pyinstaller 会把虚拟环境中的库可打包起来,导致文件很大
参数
1
| pyinstaller -F -w test.py
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| pyinstaller [opts] -i D:\test.ico D:\test.py -F --onefile:生成单个可执行文件,文件在 dist 中 -D --onedir:创建一个目录,包含 exe 文件,但会依赖很多文件(默认选项) -c --console, --nowindowed:使用控制台,无界面(默认) -w --windowed, --noconsole:使用窗口,无控制台(不使用命令行窗口)
-o Dir,--out=DIR:指定spec文件的生成目录,默认使用当前目录 -p DIR, --path=DIR:添加搜索路径,让其找到对应的库,添加 Python 使用的第三方库,可使用路径分隔符(Windows 使用分号,Linux 使用冒号)来分隔多个路径 -i 改变可执行文件的 icon 图标 -n NAME,--name=NAME:指定项目(产生的spec)名字,省略则使用第一个脚本的主文件名作为spec的名字 -i :添加图标
--hidden-import:导入未打包进来的模块 --paths:指定导入文件的路径 -K 当包含 tcl 和 tk 也就是使用 tkinter 时加上-K 参数
-d --debug:产生debug版本的可执行文件 -a --ascii:不包含Unicode字符集支持 --add-data ".\\config\\*;.\\data"
--upx-dir="C:\Softwares\upx" # 指向upx的文件夹
|
spec
- hiddenimports:PyInstaller 会试图分析 import,但只打包了用到了的,其他的动态的 import 或想要加入的可手动指定。
注意事项
- 路径尽量用英文,不然可能出错
- 调用的图片等资源需复制进去
- 错误的参数,或中途中断,可能导致 py 文件变成 0KB 的空文件。新手打包前先备份相关文件
- 去掉所有没用上的 import,精简之。不然可能打包出来的文件超大
失败集锦
安装失败
- 从 python 3.6 开始,enum34 库不再与标准库兼容。遇到相关问题卸载之
找不到相关文件
1 2 3
| import sys import os sys.path.append(os.getcwd())
|
有些包不支持
requests 只支持到 2.10
支持列表
遇到的问题
- 问题:找不到:pywintypes38.dll
- 解决方案:pyinstaller v4.4 找不到,降级到 v4.3 后就可以了
- 问题:upx(v_4.0.2)打包 streamlit(v_1.20.0)时,会出现程序无报错退出
- 解决方案:暂没好的解决方案,不用 upx
gooey
gooey:号称一条命令将命令行程序变成 gui 程序
Nuitka
Nuitka:将脚本、模块、包编译成可执行文件或扩展模块
- 测试的时候不要加 –onefile,因为会增加打包的时间,在确定了没有问题再添加
- 相对于 Pyinstaller:
- 将 Python 源代码编译为 C/C++
- 性能与文件大小的双重优化
- 劣势:
- 编译时间较长
- 学习曲线较陡
- 复杂性较高
Nuitka 打包是真的慢,每次要半个小时左右,参数尽量写到配置文件里,这样就不用每次更改都重新打包,只需要更换配置文件即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| pip install nuitka nuitka --mingw64 --show-progress --onefile --standalone --windows-console-mode=disable --enable-plugin=pyside2 --include-package=ddddocr D:\...\NewEnvs\main.py
--mingw64 使用mingw-w64-gcc编译器,不写这个好像是会默认一个别的,没有太理解 --standalone # 独立环境,这样才能在不安装Python解释器的系统上运行 --windows-console-mode=disable 没有CMD控制窗口 --output-dir=out 生成exe到out文件夹下面去 --show-progress 显示编译的进度,很直观 --show-memory 显示内存的占用 --enable-plugin=pyside2 指定需要使用的插件,我的是pyside2,没有可以不填 --onefile 打包成单个的exe文件 --include-package=PACKAGE 指定导入包,而不是nuitka自动导入 --include-module=MODULE 指定导入模块,而不是nuitka自动导入
# 优化 --lto:启用链接时优化(Link Time Optimization),进一步优化二进制文件体积和性能: --nofollow-imports:避免跟踪不必要的模块依赖导入,减少可执行文件的体积。 --remove-output:在每次构建完成后,删除临时的构建文件,节省磁盘空间。 # 基本参数 --standalone: 独立环境,使结果可移植 --onefile: 打包为单外个exe文件 --enable-plugin=tk-inter 打包tkinter模块的需要 --remove-output 打包结束后删除产生的临时文件 --windows-disable-console 去掉运行时cmd窗口
--standalone 独立环境,使结果可移植 --windows-disable-console 去掉CMD控制窗口 --output-dir=out 生成exe到out文件夹下面去 --show-progress 显示编译的进度 --show-memory 显示内存的占用 --enable-plugin=pyside6 打包pyside6模块的需要 --plugin-enable=tk-inter 打包tkinter模块的需要 --plugin-enable=numpy 打包numpy,pandas,matplotlib模块的需要 --plugin-enable=torch 打包pytorch的需要 --plugin-enable=tensorflow 打包tensorflow的需要 --windows-icon-from-ico=你的.ico 软件的图标 --windows-company-name=Windows下软件公司信息 --windows-product-name=Windows下软件名称 --windows-file-version=Windows下软件的信息 --windows-product-version=Windows下软件的产品信息 --windows-file-description=Windows下软件的作用描述 --windows-uac-admin=Windows下用户可以使用管理员权限来安装 --linux-onefile-icon=Linux下的图标位置 --onefile 打包为单个exe文件 --include-package=复制比如numpy,PyQt5 这些带文件夹的叫包或者轮子 --include-module=复制比如when.py 这些以.py结尾的叫模块 –-include-package-data=包含给定软件包名称中的数据文件,等号后软件包名称。有的时候Nuitka并不能正确分析出一些Python软件包所需要使用的数据文件,在运行程序时提示FileNotFoundError等错误,此时就需要使用该选项。如:--include-package-data=ultralytics –-include-data-files= 按文件名包含数据文件,等号后的格式为<SRC=DEST>。SRC指的是文件夹的路径,DEST指的是文件夹相对于打包结果的路径,其中DEST只能使用相对路径。如:--include-data-files=/Users/admin/Downloads/yolov5n.pt=./yolov5n.pt -–include-data-dir= 包含文件夹中的数据文件,等号后的格式为<SRC=DEST>。使用方法与--include-data-files=相同。
|
pynsist
pynsist:一个用来创建 Windows 安装程序的工具,可以在安装程序中打包 Python 本身。
auto-py-to-exe
- 是做了一个界面,来生成 pyinstaller 的运行命令,底层还是 pyinstaller