You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Rust与Python项目打包为单个EXE可执行文件?

构建Rust+Python(PyO3)项目为单个EXE的步骤

一、调整Rust项目配置

首先确保Cargo.toml里的PyO3依赖配置正确,若以Rust作为程序入口,需明确二进制目标并启用必要特性:

[package]
name = "rust_py_app"
version = "0.1.0"
edition = "2021"

[dependencies]
# 启用自动初始化Python解释器、静态链接特性(关键,避免依赖系统Python DLL)
pyo3 = { version = "0.21", features = ["auto-initialize", "static-link"] }
# 若需嵌入Python文件,可添加资源嵌入依赖
resfile = "0.1"

如果核心逻辑在src/lib.rs中,需新增src/main.rs作为程序入口,负责加载Python代码并调用Rust逻辑。

二、处理Python代码的打包依赖

由于myPy目录下存在多文件依赖(main.py导入其他Python模块),需确保打包后这些文件能被正确加载,两种可行方案:

方案1:嵌入Python文件到Rust二进制,运行时临时释放

将所有Python文件通过Rust宏嵌入编译后的二进制,启动时写入临时目录并添加到Python路径:

use pyo3::prelude::*;
use std::fs::{self, File};
use std::io::Write;
use std::path::Path;

// 嵌入myPy下的所有Python文件
const MAIN_PY: &[u8] = include_bytes!("../myPy/main.py");
const UTILS_PY: &[u8] = include_bytes!("../myPy/utils.py");
// 按需添加其他Python文件

fn extract_py_files(temp_dir: &Path) -> PyResult<()> {
    // 创建临时myPy目录
    let py_dir = temp_dir.join("myPy");
    fs::create_dir_all(&py_dir)?;

    // 写入嵌入的Python文件
    let mut main_file = File::create(py_dir.join("main.py"))?;
    main_file.write_all(MAIN_PY)?;

    let mut utils_file = File::create(py_dir.join("utils.py"))?;
    utils_file.write_all(UTILS_PY)?;

    // 将临时目录加入Python搜索路径
    Python::with_gil(|py| {
        let sys = py.import("sys")?;
        sys.call_method1("append", (py_dir.to_str().unwrap(),))?;
        Ok(())
    })
}

fn main() -> PyResult<()> {
    // 创建唯一临时目录避免冲突
    let temp_dir = std::env::temp_dir().join("rust_py_temp");
    extract_py_files(&temp_dir)?;

    // 执行Python入口逻辑(假设main.py有main()函数)
    Python::with_gil(|py| {
        let main_module = py.import("myPy.main")?;
        main_module.call0("main")?;
        Ok(())
    })
}

方案2:用cargo-bundle打包资源

通过cargo-bundle将Rust二进制与Python文件打包为单个EXE:

  1. 安装工具:cargo install cargo-bundle
  2. 在项目根目录创建Bundle.toml:
[bundle]
name = "RustPyApp"
identifier = "com.yourdomain.rustpyapp"
version = "0.1.0"
executable = "target/release/rust_py_app"

[[bundle.resources]]
path = "myPy"
  1. 编译Rust release版本:cargo build --release --features pyo3/static-link
  2. 执行打包:cargo bundle --release,生成的EXE位于target/release/bundle/windows/RustPyApp/目录下。

三、关键:静态链接Python解释器

要生成完全独立的EXE,必须确保PyO3静态链接Python解释器:

  • Windows环境下,需提前安装对应版本的Python静态库,或设置环境变量指定Python版本,如set PYO3_PYTHON=3.10
  • 编译时必须加上--features pyo3/static-link参数,避免EXE依赖系统中的python*.dll

四、验证独立运行

将编译/打包后的EXE复制到无Python环境的机器上测试,确认能正常执行所有Rust与Python逻辑。

内容的提问来源于stack exchange,提问作者Bdorg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 02:35:05