Python 打包工具 Nuitka 入门指南

2023-05-16

Python 打包工具 Nuitka 入门指南

起因

由于最近用Python写了一个跟目标检测相关的小工具,如果直接分发代码文件一来是不够优雅,二来是对非计算机领域的用户来说不够友好,因此我萌生了给小工具打包的想法。

本来我以为这应该是一个轻松而愉快的过程,一行命令一个回车,然后去摸鱼20分钟,回来就可以收获到一个完美打好包的可执行文件。然而事情并没有我想象的那般顺利,甚至可以说是困难重重、荆棘丛生。不断地排查原因查找可能的错误,最后我花了两天的时间才终于打出了一个可以完美运行的可执行文件。

因此,我希望这一篇文章可以帮助到也正在为Python程序打包而苦恼的同学们。

环境

  • Python 3.9 (CPython)
  • Nuitka 1.5.3

常用选项

通用选项

  • –standalone 使得打包结果与本地的Python环境无关,即使得打包结果具备可移植性。
  • –onefile 使得打包结果为一个可执行文件,而不是一个文件夹。

小结:--onefile选项下打出来的包本身就具备可移植性,因此不需要额外加上 --standalone--onefile 打包结果像绿色软件,仅一个可执行文件;--standalone的打包结果像经过安装的软件,文件夹下包含运行所需要的文件和程序入口。

  • –remove-output 在打包结束后,清理打包过程中生成的临时文件。
  • –enable-plugin= 启用插件,等号后跟插件名。在要打包的Python代码使用了一些特殊的包时,需要启用插件,Nuitka才能够正确打包。如:如在代码中使用了PySide6,就需要加上--enable-plugin=pyside6。具体的插件列表可以使用nuitka --plugin-list来查看。
  • –disable-console 在运行打包后的程序时,不会弹出控制台,而是直接运行GUI程序。

手动修复选项

打包程序往往并不是一次就能够打包成功的,常常会出现分析不出一部分的引用关系,忽略了一些数据文件等等情况。在这些情况下,我们需要根据运行程序后显示的报错信息,使用下面的选项来打出正确的包。

  • –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=相同。

Windows 独占选项

  • –windows-icon-from-ico= 为打包后的可执行文件添加图标,等号后跟图标文件路径。

值得注意的是,图标的格式也可以不是.ico,只需要安装过imageio包,Nuitka便可以自动将图片转换为.ico格式。

MacOS独占选项

  • –macos-create-app-bundle 创建应用程序(.app),而不是Unix可执行文件。(截至 Nuitka 1.5.3 还是实验性功能,可用性较低)
  • –macos-app-icon= 设置应用程序图标,等号后跟图标文件路径。同样,图标的格式也可以不是.icns,只需要安装过imageio包,Nuitka便可以自动将图片转换为.icns格式。

无需关注的选项

  • –follow-imports 作用是在打包过程中分析程序的引用关系,将Python主程序引用的包也一并打包。其实这件事本身很重要,毕竟在大多数情况下应该没人希望Nuitka只打包一个Python主程序文件。但是在 --standalone 和 --onefile 下,该选项是强制启用的,因此不需要额外加上。
  • –nofollow-import-to= 作用是在打包过程中忽略指定的Python软件包。作为入门指南,我不建议使用该选项,因为不当使用会引入一些难以解决的问题。

实用命令

python -m nuitka --help # 查看 Nuitka 帮助手册
python -m nuitka --plugin-list # 查看 Nuitka 插件列表

举例

python -m nuitka --standalone --remove-output {your_python_program_name}.py
python -m nuitka --onefile --remove-output {your_python_program_name}.py

python -m nuitka --standalone --disable-console --enable-plugin=pyside6 --remove-output {your_python_GUI_program_name}.py
python -m nuitka --macos-create-app-bundle --disable-console --enable-plugin=pyside6 --remove-output {your_python_GUI_program_name}.py

注意事项

  1. 官方文档中提到,相对于直接使用nuitka命令,python -m nuitka是更好的选择。

Avoid running the nuitka binary, doing python -m nuitka will make a 100% sure you are using what you think you are. Using the wrong Python will make it give you SyntaxError for good code or ImportError for installed modules. That is happening, when you run Nuitka with Python2 on Python3 code and vice versa. By explicitly calling the same Python interpreter binary, you avoid that issue entirely.

  1. 用于执行Nuitka的Python解释器最好是CPython,即Python解释器的标准实现。使用Apple Python等Python解释器部分功能将受限。

It has to be CPython, Anaconda Python.

You need the standard Python implementation, called “CPython”, to execute Nuitka, because it is closely tied to implementation details of it.

优点

  1. 对动态链接库的分析相对准确
  2. 打包生成的软件占用空间较小

缺点

  1. 打包时间相对较长
  2. 有商业版本,需要收费

尾声

如果您觉得我写的还不错的话,希望您可以点个赞,点个收藏,您的支持对我来说非常重要!

我热烈欢迎您转载我的这篇文章,但要求您标明作者与出处。

如果文章中存在侵权之处,也请您告知我,我将及时修改。

参考

  1. Nuitka User Manual — Nuitka the Python Compiler documentation
  2. Nuitka Github 仓库
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 打包工具 Nuitka 入门指南 的相关文章

  • 免费常用API接口

    短信API 短信验证码 xff1a 可用于登录 注册 找回密码 支付认证等等应用场景 支持三大运营商 xff0c 3秒可达 xff0c 99 99 xff05 到达率 xff0c 支持大容量高并发 通知短信 xff1a 当您需要快速通知用户
  • 安全可靠的短信验证码API,毫秒级反应

    短信验证码是一种功能强大的网络安全技术 xff0c 可以确保网站的真实性和安全性 它的使用非常简单 xff1a 用户只需要通过他 她的手机发送位编码短信给网站 xff0c 然后在网站上输入这个验证码 xff0c 就可以实现一种双重认证的功能
  • 如何利用 IP 归属地查询 API 精准锁定用户位置

    引言 在互联网时代 xff0c IP 地址扮演着非常重要的角色 xff0c 它可以帮助我们追踪网站访问者 优化网络服务等等 而 IP 归属地则更进一步 xff0c 它可以帮助我们精确地定位 IP 地址所在的地理位置 xff0c 为数据分析
  • 涨知识!细数银行卡三要素 API 的 N 种验证方法

    引言 银行卡三要素验证 API 是一种基于姓名 身份证号码和银行卡号等三种信息的验证服务 xff0c 主要用于绑定银行卡时校验银行卡是否为该身份信息所有 手机号是否为银行卡绑定手机号 银行卡三要素 API 的验证方法 银行卡三要素 API
  • 常用的热门 API 分享

    手机号码归属地 xff1a 提供三大运营商的手机号码归属地查询 空号检测 xff1a 通过手机号码查询其在网活跃度 xff0c 返回包括空号 停机等状态 手机在网状态 xff1a 支持传入三大运营商的号码 xff0c 查询手机号在网状态 x
  • 通知短信 API 技术细节以及发送流程机制原理解析

    引言 短信是一种简单 直接 高效的通信方式 xff0c 被广泛应用于各个领域 在移动互联网时代 xff0c 短信成为了客户服务 政府通知 公共服务等方面的重要工具 为了更好地利用短信这种通信方式 xff0c 通知短信 API应运而生 短信A
  • vSphere ESXI主机网络分析工具

    1 net stats 该命令可以收集端口统计信息 可以通过net stats h 命令显示所有标志 最常见的是使用 net stats l 来确定所有 VMkernel 接口 vmnic 上行链路和 vNIC 端口的交换机端口号和 MAC
  • 算法中的一些数学问题

    1 欧几里得算法 xff08 辗转相除法 xff09 该算法用来快速计算两个整数的最大公约数 递归算法 xff1a int gcd int a int b if b 61 61 0 return a return gcd b a b 非递归
  • 安装pillow已完成,但仍报错No module named ‘PIL‘

    python 3 6 2 xff0c 安装pillow已完成 xff0c 但仍报错No module named 39 PIL 39 no module named 39 pillow 39 python3 6 我加班还不行吗 的博客 CS
  • 使用汇编语言与C语言实现LED1/LED2/LED3三盏灯点亮

    汇编语言代码段 text global start start LED1点灯LED1 gt PE10 64 1 对LED1进行初始化 RCC AHB4 ENSETR MODER OTYPER OSPEEDR PUPDR 64 2 实现LED
  • linux移动文件夹

    使用命令mv 要移动的文件夹 目标文件夹 假如我要将root下的文件amelia txt移动到opt下的文件夹software中 xff0c 我可以使用命令mv root amelia txt opt software amelia txt
  • docker安装nextcloud,聪明人已经收藏了!

    1 为什么要使用分布式锁 使用分布式锁的目的 xff0c 无外乎就是保证同一时间只有一个客户端可以对共享资源进行操作 1 1举一个很长的例子 系统 A 是一个电商系统 xff0c 目前是一台机器部署 xff0c 系统中有一个用户下订单的接口
  • CCF CSP 序列查询新解

    CCF CSP 序列查询新解 C语言 题目背景 上一题 序列查询 中说道 xff1a A 61 A0 A1 A2 An 是一个由 n 43 1 个 0 N 范围内整数组成的序列 xff0c 满足 0 61 A0 lt A1 lt A2 lt
  • 打开edge,出现错误代码: STATUS_ACCESS_DENIED,解决方法

    问题描述 xff1a 这个问题 xff0c 一般显示edge页面加载失败 xff0c 且电脑右下角出现弹窗 解决办法 xff1a 此时 xff0c 你可以到C盘 xff0c 把Microsoft下的子文件删掉 xff0c 注意最好用dele
  • JS的表达式

    一 原始表达式 1 表达式是js的代码形式 2 原始表达式包含直接量 关键字和变量名 xff1b lt script gt 直接量 100 xff1b 200 2 xff1b 34 hi 34 关键字 True False 变量名 a 函数
  • JS的DOM操作——style的操作

    对于JS操作文档中的元素 xff0c 改变其的样式特征需要用到一个属性 style 常见操作 xff1a 获取的元素点 xff08 xff09 style xx 需要设置或修改的属性 代码演示 xff1a 例如修改div块的背景颜色 lt
  • 学会iframe并用其解决跨域问题

    了解iframe 官方定义为 xff1a iframe是HTML标签 xff0c 作用是文档中的文档 xff0c 或者浮动的框架 FRAME iframe元素会创建包含另外一个文档的内联框架 xff08 即行内框架 xff09 简单理解为
  • Vue中的样式绑定

    我们将样式绑定分为两种 xff1a 一种是通过style绑定 xff0c 一种是通过class绑定 样式绑定适用于 切换效果的实现 xff0c 小规模用style xff0c 大规模用class style绑定样式 这里需要用到v bind
  • 51 汇编语言编程:8个按键控制8个LED

    89C51汇编语言写8个按键控制8个LED 按键接P2口 xff0c LED接P1口 有6按键 xff0c 按下对应LED长亮 xff0c 重复按下 xff0c LED灭 xff1b 有两个特殊按键 xff0c 按下 xff0c 对应LED
  • 常见的排序算法

    今天来学习一下数据结构课程中非常重要的排序算法 我们学习一下一些常见的排序算法 xff0c 如冒泡排序 选择排序 快速排序等 1 冒泡排序 实现思路 xff1a 对未排序的各元素从头到尾依次比较相邻的两个元素大小关系 如果左边的队员大 则两

随机推荐

  • Vue的仓库vuex

    Vue js是一个渐进式的框架 xff0c 是一个分层的设计模式 一共分为五层 xff0c 核心库为基础 xff0c 在这基础上添加组件系统 客户端路由 大规模状态管理和开发环境 其中大数据状态管理对应的技术就是vuex xff0c 它是由
  • vue3.0的setup函数以及解决其内的数据不是响应式数据的问题

    相比于2 0 xff0c vue3 0在新增了一个setup函数 xff0c 我们在setup中可以写数据也可以写方法 xff0c 就像我们以前最开始学习js一样 xff0c 在js文件中写代码 如 xff1a setup let name
  • setup中使用watch

    watch属性监听器的作用在vue3 0中没有改变 xff0c 还是监听值得变化 在vue3 0中 xff0c 仍然支持watch配置项 但是我们要在setup中使用watch得话 xff0c 我们要导入watch的API xff0c 然后
  • 缓存相关知识点

    缓存的优点 1 减少不必要的数据传输 xff0c 节省带宽 2 减轻服务器负担 xff0c 提升网站性能 3 加快客户端网页加载速度 4 用户体验更好 缺点 如果资源发生更改 xff0c 客户端不及时更新会导致用户获取信息滞后 缓存类型 分
  • hook之useMemo

    useMemo 这个hook的作用有点像我们以前学习的计算属性一样 xff0c 它会缓存我们上次的结果 xff0c 只有当特定的属性改变时才从新计算 并且他能 记住 任何类型的值 标准写法 useMemo 61 gt return 34 我
  • hook之useContext

    useContext这个hook xff0c 我们通过翻译就可以大致知道它的用途 xff0c 译为使用上下文 context上下文我们在前面就已经使用过了 xff0c 它是一种用于跨组件之间的传值的技术 我们学过Context xff0c
  • hook之useRoducer

    useReducer用最简单的话来说 xff0c 就是允许我们在函数组件里面像使用redux一样通过reducer和action来管理我们组件状态的变换 我们可以通过useContext配合实现一个函数组件中的redux useReduce
  • linux安装jenkins 【详细教程】

    1 确保jdk已经安装 xff0c 至少是java8以上 xff0c 如果没有安装 xff0c 可以参考https blog csdn net m0 59347746 article details 125681582 csdn share
  • 【笔记】SQL 2

    1 比较运算符 比较运算符用于比较运算 xff0c 判断逻辑是否成立 A operator B 常用的比较运算符有 61 xff08 等于 xff09 61 xff08 不等于 xff09 lt gt xff08 不等于 xff09 lt
  • Qt Creator 3.0.1 部署远程调试

    QT Creator3 0 1 部署远程调试 远程目标板连接配置 从菜单栏选择options gt devices gt add gt generic linux device gt 开始向导 输入目标板的IP与登录用户信息 完成后会自动测
  • 代码源oj--数据结构初级:105 字符串处理1

    给定一个长度为n的字符串s xff0c 字符串由小写字母a z组成 小明来对这个字符串进行操作 xff0c 他会从头到尾检查这个字符串 xff0c 如果发现有两个相同的字母并排在一起 xff0c 就会把这两个字符都删掉 小明会重复这个操作
  • Python 视频转字符画 - 进阶

    昨晚我在网上看到了别人做的视频转字符动画 xff0c 觉得很厉害 xff0c 我于是也打算玩玩 今天中午花时间实现了这样一个小玩意 顺便把过程记录在这里 1 源视频 xff1a https docs qq com doc DU3pabWFh
  • Python教程 - Tkinter布局

    之前的Tkinter教程中 xff0c 我们创建的控件默认都是从上到下依次排列的 实际上 xff0c 我们可以完全控制每个控件的位置 Tkinter主要提供pack grid place三种布局方法 pack布局 pack布局 xff0c
  • java实现字符串中的字母排序

    String str 61 34 chenughonghuiaikuangwantong1314 34 System out println 34 原字符串 xff1a 34 43 str char chars 61 str toCharA
  • 这个 Python 游戏库,打开就能玩一天

    会 Python 的小伙伴 xff0c 选择用 Python 让 大风车 吱呦呦地转 xff01 还有的小伙伴 xff0c 选择用 Turtle 库绘制童年的卡通人物 我们其实还可以选择用 Python 开发小游戏 xff0c 回忆童年的美
  • k8s集群中部署rancher v2.7高可用集群

    一 xff0c 什么是 Rancher xff1f 官网地址 xff1a 什么是 Rancher xff1f Rancher Manager Rancher 是一个 Kubernetes 管理工具 xff0c 让你能在任何地方和任何提供商上
  • [Ubuntu] 虚拟机忘记登录密码的解决方案

    前言 xff1a 此文章仅作为本人在学习过程中的学习笔记 xff0c 同时也为记录此解决方案亲测有效 特别注明 xff1a 解决方案也是借鉴前人的成就 Ubuntu 虚拟机太久没登录 xff0c 忘记密码了 多次尝试无果后 xff0c 只好
  • shell脚本中常用的基础命令

    Shell xff08 Shell Script xff09 脚本又称Shell命令稿 程序化脚本 xff0c 是一种计算机程序使用的文本文件 xff0c 其内容由一连串的shell命令组成 xff0c 经由Unix Shell直译内容后运
  • 常用DOS命令和Path环境变量的配置

    常用DOS命令和Path环境变量的配置 1 常用DOS命令1 1 打开命令提示符窗口1 2 常用DOS命令 2 Path环境变量的配置2 1 为什么要配置Path环境变量2 2 配置流程2 3 检测Path环境变量配置是否成功 1 常用DO
  • Python 打包工具 Nuitka 入门指南

    Python 打包工具 Nuitka 入门指南 起因 由于最近用Python写了一个跟目标检测相关的小工具 xff0c 如果直接分发代码文件一来是不够优雅 xff0c 二来是对非计算机领域的用户来说不够友好 xff0c 因此我萌生了给小工具