如何将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:
- 安装工具:
cargo install cargo-bundle - 在项目根目录创建
Bundle.toml:
[bundle] name = "RustPyApp" identifier = "com.yourdomain.rustpyapp" version = "0.1.0" executable = "target/release/rust_py_app" [[bundle.resources]] path = "myPy"
- 编译Rust release版本:
cargo build --release --features pyo3/static-link - 执行打包:
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
相关产品推荐
相关产品推荐

