使用nuitka打包python为exe并发布
Published in:2024-04-09 |
Words: 1.3k | Reading time: 5min | reading:

使用nuitka打包python为exe并发布

简介

Nuitka is the optimizing Python compiler written in Python that creates executables that run without an need for a separate installer. Data files can both be included or put alongside.

Nuitka is fully compatible with Python 3 (3.4 — 3.11) and Python 2 (2.6, 2.7), works on Windows, macOS, Linux and more, basically where Python works for you already.

  • 使用此库可达到以下目的:
  • 隐藏源码。这里的pyinstaller是通过设置key来对源码进行加密的;而nuitka则是将python源码转成C++(这里得到的是二进制的pyd文件,防止了反编译),然后再编译成可执行文件。
  • 方便移植:跨平台,可多平台使用:win、mac、linux等

优势

  • 小体积
  • 启动快速
  • 不易逆向解析

缺点

  • 打包较为缓慢
  • 仅提供命令行式打包(无配置文件)

安装

  • nuitka主要通过pip命令安装,具体如下:
    1
    2
    3
    pip install Nuitka
    pip install ordered-set
    pip install zstandard
  • 如果上述命令执行较慢,可使用镜像源安装:
    1
    2
    pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple Nuitka

打包发布

  • 命令举例如下:
    1
    2
    3
    4
    5
    6
    7
    # --follow-import-to为需要打包的模块名 
    # --output-dir=out 为打包完成后输出的exe地址
    # --show-progress 显示打包进度
    # ./run/run_py.py 程序入口
    # --standalone 跨平台和不同计算机运行exe必选option
    # --mingw64 使用mingw64 打包
    python -m nuitka --mingw64 --standalone --follow-import-to=utils,api,log,run --output-dir=out --show-progress ./run/run_py.py

常见command option 解析

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
–mingw64 #默认为已经安装的vs2017去编译,否则就按指定的比如mingw(官方建议)
–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 #像pyinstaller打包成单个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=相同。
–follow-import-to=MODULE/PACKAGE #如果使用该模块,请遵循该模块;如果是一个包,请遵循整个包。可以多次给定。默认为空。
# 提示:首次打包建议去掉–windows-disable-console,以保留控制台便于排查问题。
--enable-plugin #指定需要加载的插件,比如说tk-inter、pyqt5等
--plugin-list #查看支持的插件
--remove-output #打包结束之后自动清理build文件夹
--windows-icon-from-ico #指定程序图标(针对Windows系统)
--msvc #指定使用MSVC的版本,不指定则使用系统默认版本
--company-name #公司名
--product-name #产品名
--file-version #文件版本,最多4个数字序列,例如1.0、1.0.0.0
--product-version #产品版本,规则与–file-version相同
--file-description #文件描述

mingw64下载缓慢

  • 在以下目录放置手动下载的mingw安装包
    1
    https://www.mingw-w64.org/downloads/

    文件名如下

    1
    winlibs-x86_64-posix-seh-gcc-13.2.0-llvm-16.0.6-mingw-w64msvcrt-11.0.1-r1.zip
  • 需要手动移动至以下目录(无法自定义目录,只能使用默认路径)
    1
    C:\Users\Administrator\AppData\Local\Nuitka\Nuitka\Cache\downloads

    放置完成后,重新运行上述命令即可打包成功!
    当控制台询问是否安装gcc时, 输入yes进行安装

打包完成后,效果如下:

  • 如题

pyinstaller 与 nukia打包结果对比

大小对比

  • 如图

启动速度对比

  • nuitkia比pyinstaller打包exe启动同一程序快66%

特殊库引入

  • 举例:pyqt5
    1
    2
    3
    4
    5
    6
    # 启用pyqt5插件
    --plugin-enable=pyqt5
    # 禁用控制台窗口
    --windows-disable-console
    # 启用图标
    --windows-icon-from-ico=favicon.ico
  • 例如执行以下命令:
    1
    nuitka --mingw64 --standalone --show-progress --show-memory --output-dir=out   --plugin-enable=pyqt5 --windows-disable-console  --windows-icon-from-ico=favicon.ico xxx.py

See

Prev:
使用pyinstaller打包python程序并发布
Next:
基于opencv使用python实现人脸识别与视频生成