本文记录在虚拟环境下使用Nuitka将Python 脚本或程序打包独立的可执行文件(exe)的过程,并给出一些打包建议。
主要内容包括:
(1)py文件打包的背景和现状;
(2)如何使用 Nuitka 打包 Python 脚本(加密和不加密);
(3)如何分离核心代码与依赖,优化打包流程;
(4)打包顽固派,如numpy,pandas,Scipy等,该如何处理?
随着 Python 在软件开发和自动化任务中的广泛应用,如何方便地分发 Python 程序成为了许多开发者关注的问题。打包为独立的可执行文件(exe)能够让非技术用户在目标环境中无需安装 Python 或配置依赖,即可直接运行程序。这不仅提升了用户体验,还减少了环境配置带来的潜在问题。
一、为什么要打包为可执行文件?
为什么要打包为可执行文件?
-
提升可移植性
将 Python 脚本打包为可执行文件后,可以在没有 Python 解释器的环境中直接运行,降低了对运行环境的依赖。 -
保护源代码
可执行文件会将代码编译为二进制形式,避免源代码直接暴露,提升了代码的安全性。 -
简化分发
用户无需额外安装库或解释器,仅需双击可执行文件即可使用,减少了运行前的环境配置步骤。 -
性能优化
部分打包工具(如 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 打包的优势:
-
虚拟环境隔离
Miniconda 提供的虚拟环境可以隔离项目依赖,确保打包时只包含必要的依赖,避免不必要的体积增加。 -
精简环境
Miniconda 的轻量特性使得构建的环境更加精简,降低了冗余文件对最终打包结果的影响。 -
与 Nuitka 高度兼容
Nuitka 与 Miniconda 配合使用,可以轻松配置所需的编译器(如 MinGW),提供更高效的 C/C++ 编译支持,优化可执行文件的运行性能。
在后续内容中,我们将详细介绍如何使用 Nuitka 从零开始打包 Python 脚本或程序,包括:
-
配置 Miniconda 虚拟环境,安装必要的依赖。
-
准备打包脚本及相关文件。
-
Nuitka 的基本用法和高级配置。
-
提供优化建议和常见问题的解决方法。
通过这些步骤,您可以快速将 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打包脚