使用 Nuitka 打包 Python 脚本为独立的可执行文件

本文记录在虚拟环境下使用Nuitka将Python 脚本或程序打包独立的可执行文件(exe)的过程,并给出一些打包建议。

主要内容包括:

(1)py文件打包的背景和现状;

(2)如何使用 Nuitka 打包 Python 脚本(加密和不加密);

(3)如何分离核心代码与依赖,优化打包流程;

(4)打包顽固派,如numpy,pandas,Scipy等,该如何处理?

图片

随着 Python 在软件开发和自动化任务中的广泛应用,如何方便地分发 Python 程序成为了许多开发者关注的问题。打包为独立的可执行文件(exe)能够让非技术用户在目标环境中无需安装 Python 或配置依赖,即可直接运行程序。这不仅提升了用户体验,还减少了环境配置带来的潜在问题。

一、为什么要打包为可执行文件?

为什么要打包为可执行文件?

  1. 提升可移植性
    将 Python 脚本打包为可执行文件后,可以在没有 Python 解释器的环境中直接运行,降低了对运行环境的依赖。

  2. 保护源代码
    可执行文件会将代码编译为二进制形式,避免源代码直接暴露,提升了代码的安全性。

  3. 简化分发
    用户无需额外安装库或解释器,仅需双击可执行文件即可使用,减少了运行前的环境配置步骤。

  4. 性能优化
    部分打包工具(如 Nuitka)会将 Python 脚本编译为 C/C++ 代码后再打包,从而带来一定的性能提升。

二、常用打包技术路线及其优缺点?

常用打包技术路线及其优缺点:

工具

优点

缺点

PyInstaller

支持多种平台,操作简单,支持大多数常见模块。

打包后的文件较大,运行效率未显著优化。

cx_Freeze

可自定义打包,支持跨平台应用开发。

配置稍显复杂,兼容性不如 PyInstaller。

Nuitka

将 Python 转换为 C/C++ 代码编译后打包,运行效率更高。

编译速度较慢,依赖 C/C++ 编译器,初始学习成本稍高。

三、打包常碰到的问题?

然而,当我们在打包一些较大的项目时,常碰到的问题一般包括:

✔ 直接打包失败;

✔ 打包的文件过大;

✔ 打包时间过长;

✔ 打包结果无法运行,报错无法导入各种模块和依赖等。

尤其是当代码中包含一些模块,如numpy、pandas、pytorch、cv2等;

四、如何使用 Nuitka 打包 Python 脚本?

本文主要分享在虚拟环境下(python版本3.9),使用Nuitka(2.5.6) 打包python脚本的过程。

使用 Miniconda 创建虚拟环境并结合 Nuitka 打包的优势:

  1. 虚拟环境隔离
    Miniconda 提供的虚拟环境可以隔离项目依赖,确保打包时只包含必要的依赖,避免不必要的体积增加。

  2. 精简环境
    Miniconda 的轻量特性使得构建的环境更加精简,降低了冗余文件对最终打包结果的影响。

  3. 与 Nuitka 高度兼容
    Nuitka 与 Miniconda 配合使用,可以轻松配置所需的编译器(如 MinGW),提供更高效的 C/C++ 编译支持,优化可执行文件的运行性能。

在后续内容中,我们将详细介绍如何使用 Nuitka 从零开始打包 Python 脚本或程序,包括:

  1. 配置 Miniconda 虚拟环境,安装必要的依赖。

  2. 准备打包脚本及相关文件。

  3. Nuitka 的基本用法和高级配置。

  4. 提供优化建议和常见问题的解决方法。

通过这些步骤,您可以快速将 Python 脚本打包为高效、可靠的可执行文件,为程序分发和部署提供便利。

4.1 安装miniconda

下载地址:https://repo.anaconda.com/miniconda/

安装过程一般不会有什么问题,略过。

4.2 创建虚拟环境

①在cmd窗口中输入以下命令;

conda create --prefix C:\ProgramData\Miniconda3\envs\package_exe_test python=3.9.21

图片

②输入:y,回车后等到虚拟环境创建;

③创建完成后,按提示激活虚拟环境 package_exe_test ;

图片

④添加镜像;

  • 镜像源

    • 大多数国内镜像源都会同时托管 defaults 和 conda-forge 通道。这意味着你可以通过这些镜像源访问 both Anaconda 官方提供的包和 conda-forge 社区提供的包。
    • conda-forge 是一个独立的通道,不仅仅存在于某些特定的镜像源中。你也可以直接使用 conda-forge 通道而不需要通过国内镜像源。
  • 选择策略

    • 如果你希望通过国内镜像源加速包的下载,可以选择一个可靠的国内镜像源,并确保它包含了 conda-forge 通道。

    • 如果你需要特定的包并且不确定是否在某个镜像源中可用,可以直接添加 conda-forge 通道作为备选。

添加镜像命令示例:

conda config --add channels defaults conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ conda config --set show_channel_urls yes

移除镜像命令示例:

conda config --remove-key channels

验证镜像配置:

conda config --show channels

设置通道优先级(可选):

  • 默认情况下,conda 会按照通道的顺序查找包。你可以通过设置通道优先级来确保 conda-forge 中的包优先被考虑。

  • 使用以下命令将 conda-forge 设置为最高优先级

    conda config --set channel_priority strict

图片

4.3 安装python脚本或程序中所需要的包或模块

  • 将python脚本或程序所需的包或模块的信息,导出到requirements.txt中进行安装

    conda install --file path/to/requirements.txt

  • 逐一手动安装,如:

    conda install openpyxl

最关键的是,必须安装nuitka,直接使用命令:conda install nuitka -c conda-forge安装,无报错(有些文章会提到无法正常安装nuitka的解决办法)。

图片

4.4 Nuitka打包命令参数说明

要合理有效的根据打包需求使用Nuitka打包脚

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

craybb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值