18 个版本
0.7.2 | 2024年7月2日 |
---|---|
0.7.1 | 2022年10月25日 |
0.7.0 | 2021年10月9日 |
0.6.0 | 2021年4月15日 |
0.0.3 | 2015年7月8日 |
#229 in FFI
16,330 每月下载量
用于 34 个 Crates (30 个直接使用)
1MB
21K SLoC
rust-cpython
警告:此软件包不再积极维护。请改用 PyO3。
Rust 为 Python 解释器提供的绑定。
版权所有 (c) 2015-2021 Daniel Grunwald。Rust-cpython 根据 MIT 许可证 许可。Python 根据 Python 许可证 许可。
支持的 Python 版本
- Python 2.7
- Python 3.7 至 3.12
警告:此软件包不再积极维护。请改用 PyO3。
需要 Rust 1.41.1 或更高版本。
使用方法
要使用 cpython
,请将以下内容添加到您的 Cargo.toml
[dependencies]
cpython = "0.7"
示例程序,显示 sys.version
的值
use cpython::{Python, PyDict, PyResult};
fn main() {
let gil = Python::acquire_gil();
hello(gil.python()).unwrap();
}
fn hello(py: Python) -> PyResult<()> {
let sys = py.import("sys")?;
let version: String = sys.get(py, "version")?.extract(py)?;
let locals = PyDict::new(py);
locals.set_item(py, "os", py.import("os")?)?;
let user: String = py.eval("os.getenv('USER') or os.getenv('USERNAME')", None, Some(&locals))?.extract(py)?;
println!("Hello {}, I'm Python {}", user, version);
Ok(())
}
具有 Python 绑定的示例库
以下两个文件将使用 cargo build
构建,并将生成一个兼容 Python 的库。在 Mac OS 上,您需要将输出从 *.dylib 重命名为 *.so。在 Windows 上,您需要将输出从 *.dll 重命名为 *.pyd。
注意
在构建时,python3-sys/build.rs
将在以下位置查找解释器:
PYTHON_SYS_EXECUTABLE
python
python3
选择第一个可用的、与配置的预期版本兼容的(默认情况下,任何Python 3.X解释器都适用)。如果需要特定的解释器,应将环境变量PYTHON_SYS_EXECUTABLE
指向它。
Cargo.toml
:
[lib]
name = "rust2py"
crate-type = ["cdylib"]
[dependencies.cpython]
version = "0.7"
features = ["extension-module"]
src/lib.rs
use cpython::{PyResult, Python, py_module_initializer, py_fn};
// add bindings to the generated python module
// N.B: names: "rust2py" must be the name of the `.so` or `.pyd` file
py_module_initializer!(rust2py, |py, m| {
m.add(py, "__doc__", "This module is implemented in Rust.")?;
m.add(py, "sum_as_string", py_fn!(py, sum_as_string_py(a: i64, b:i64)))?;
Ok(())
});
// logic implemented as a normal rust function
fn sum_as_string(a:i64, b:i64) -> String {
format!("{}", a + b).to_string()
}
// rust-cpython aware function. All of our python interface could be
// declared in a separate module.
// Note that the py_fn!() macro automatically converts the arguments from
// Python objects to Rust values; and the Rust return value back into a Python object.
fn sum_as_string_py(_: Python, a:i64, b:i64) -> PyResult<String> {
let out = sum_as_string(a, b);
Ok(out)
}
在Windows和Linux上,您可以使用cargo build --release正常构建。在Mac OS上,需要设置额外的链接器参数。最简单的解决方案是创建一个包含以下内容的.cargo/config
文件
[target.x86_64-apple-darwin]
rustflags = [
"-C", "link-arg=-undefined",
"-C", "link-arg=dynamic_lookup",
]
有关setup.py
集成,请参阅https://github.com/PyO3/setuptools-rust
开发
要构建软件包,运行:make build
要测试软件包,运行:make test
注意:此软件包包含多个使用脚本自动生成的文件。使用Makefile可以确保这些文件在需要时重新生成。
依赖项
~95–680KB
~13K SLoC