0%

Python-打包发布

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
pip uninstall 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
给博主来一杯卡布奇诺