在 CentOS 系统上使用 Nuitka 将 Python 程序打包为可执行文件的详细步骤如下:
1. 安装 Nuitka
首先需要安装 Nuitka 及其依赖项:
bash
# 1. 安装编译工具和依赖 gcc gcc-c++ 必须安装
sudo yum install -y gcc gcc-c++ python3-devel
# 2. 使用pip安装Nuitka
pip3 install nuitka
# 3. (可选)安装UPX以压缩可执行文件
wget https://github.com/upx/upx/releases/download/v4.0.2/upx-4.0.2-amd64_linux.tar.xz
tar -xf upx-4.0.2-amd64_linux.tar.xz
sudo cp upx-4.0.2-amd64_linux/upx /usr/local/bin/
安装完成
还需要 安装 patchelf
方法一:使用 EPEL 源安装
如果你的 CentOS 已启用 EPEL 仓库,可直接通过yum
安装:
bash
# 1. 安装EPEL仓库(若未安装)
sudo yum install -y epel-release
# 2. 安装patchelf
sudo yum install -y patchelf
# 3. 验证安装
patchelf --version # 应显示版本信息
方法二:从源码编译安装
适合需要最新版本或自定义编译选项的场景:
bash
# 1. 安装编译依赖
sudo yum install -y gcc make autoconf automake libtool
# 2. 下载源码(以0.17.2版本为例)
wget https://github.com/NixOS/patchelf/archive/0.17.2.tar.gz
tar -xf 0.17.2.tar.gz
cd patchelf-0.17.2
# 3. 编译和安装
./bootstrap.sh
./configure
make
sudo make install
# 4. 验证安装
patchelf --version
方法三:使用预编译二进制文件,centos、ubuntu、ky10 server都支持
适合快速安装,无需编译:
bash
# 1. 下载预编译二进制文件(根据系统架构选择)
wget https://github.com/NixOS/patchelf/releases/download/0.17.2/patchelf-0.17.2-x86_64.tar.gz
tar -zxvf patchelf-0.17.2-x86_64.tar.gz
# 2. 将二进制文件移动到PATH路径
sudo cp bin/patchelf /usr/local/bin/
# 3. 验证安装
patchelf --version
验证安装
2. 基本打包命令
以下是 Nuitka 的常用打包选项:
bash
# 直接用这个就行了,可以打包出来的
nuitka your_script.py
# 简单打包(生成独立目录, 依赖的文件都已经打包进去了)
nuitka --standalone your_script.py
# 生成单个可执行文件(需UPX)
nuitka --standalone --onefile your_script.py
# 启用优化(推荐)
nuitka --standalone --onefile --enable-plugin=tk-inter --optimize=3 your_script.py
# 指定Python解释器版本
nuitka --python-version=3.9 your_script.py
# 包含额外数据文件
nuitka --standalone --onefile --include-data-files=config.ini=. --include-data-files=images/*=images your_script.py
下图就是我对对应的py文件进行打包
3. 处理常见依赖
GUI 应用(如 tkinter、PyQt)
bash
# 打包tkinter应用
nuitka --standalone --onefile --enable-plugin=tk-inter your_gui_app.py
# 打包PyQt5应用
nuitka --standalone --onefile --include-package=PyQt5 your_pyqt_app.py
数据库依赖(如 SQLite、MySQL)
bash
# 打包SQLite应用
nuitka --standalone --onefile --include-data-files=/path/to/your/database.db=. your_db_app.py
# 打包MySQL应用
nuitka --standalone --onefile --include-package=mysql.connector your_mysql_app.py
科学计算库(如 NumPy、Pandas)
bash
nuitka --standalone --onefile --include-package=numpy --include-package=pandas your_data_app.py
4. 高级选项
bash
# 启用多进程编译(加速打包)
nuitka --jobs=$(nproc) your_script.py
# 使用UPX压缩可执行文件(减小体积)
nuitka --standalone --onefile --enable-plugin=upx your_script.py
# 生成详细日志(用于调试)
nuitka --standalone --onefile --verbose your_script.py
5. 示例:打包 Flask Web 应用
bash
# 假设项目结构:
# myapp/
# ├── app.py
# ├── templates/
# │ └── index.html
# └── static/
# └── style.css
# 打包命令
nuitka --standalone --onefile \
--include-data-dir=templates=templates \
--include-data-dir=static=static \
--include-package=flask \
app.py
6. 打包后测试
打包完成后,在目标环境中测试:
bash
# 1. 复制生成的可执行文件到目标机器
scp dist/your_script.bin user@target_machine:/path/
# 2. 在目标机器上运行(无需Python环境)
chmod +x your_script.bin
./your_script.bin
7. 常见问题解决
-
缺少依赖库:
bash
# 手动包含缺失的包 nuitka --standalone --onefile --include-package=missing_package your_script.py
-
文件过大:
bash
# 使用UPX压缩 nuitka --standalone --onefile --enable-plugin=upx your_script.py # 移除不必要的依赖 pip uninstall unused_package
-
运行时错误:
bash
# 添加调试信息 nuitka --standalone --onefile --debug your_script.py
8. 性能优化建议
- 使用
--optimize=3
启用最高级优化。 - 对于大型项目,使用
--jobs=$(nproc)
并行编译。 - 优先选择静态链接的 Python 解释器。
通过 Nuitka 打包的 Python 程序具有接近原生代码的执行速度,且无需在目标机器上安装 Python 环境,非常适合分发和部署。