PyO3:Python解释器的Rust绑定

2021-01-29 20:44:13

Python的Rust绑定。这包括运行Rust二进制文件中的Python代码并与之交互,以及编写本机Python模块。

对于Python 3.6,也可以使用PyPy进行构建(通过cpyext),目标PyPy版本为7.3+。请参阅指南中的pypy部分。

您可以在Rust中编写本机Python模块,也可以在Rust二进制文件中使用Python。

但是,在某些操作系统上,您需要一些其他软件包。例如。如果您使用的是Ubuntu 18.04,请运行

[package] name =" string-sum"版本=" 0.1.0"版本=" 2018" [lib]名称=" string_sum" #" cdylib"是生成供Python导入的共享库所必需的。 ##除非" rlib&#34 ;,否则下游Rust代码(包括`bin /`,`examples /`和`tests /`中的代码)将无法#使用string_sum;`。或" lib"板条箱类型也包括在内,例如:#crate-type = [" cdylib&#34 ;," rlib"] crate-type = [" cdylib"] [依赖项。 pyo3]版本=" 0.13.1"功能= ["扩展模块"]

使用pyo3 :: prelude :: *;使用pyo3 :: wrap_pyfunction; ///将两个数字的和格式化为字符串。#[pyfunction] fn sum_as_string(a:usize,b:usize)-> PyResult<字符串> {Ok((a + b)。to_string())} ///在Rust中实现的Python模块。#[pymodule] fn string_sum(py:Python,m:& PyModule)-> PyResult<()> {m。 add_function(wrap_pyfunction!(sum_as_string,m)?)?行(())}

在Windows和Linux上,可以使用cargo build --release正常构建。在macOS上,您需要设置其他链接器参数。一种选择是使用货物rustc --release--C link-arg = -undefined -C link-arg = dynamic_lookup进行编译,另一种方法是创建具有以下内容的.cargo / config:

在开发过程中,您可以符号链接(或复制)并从目标文件夹重命名共享库:在MacOS上,将libstring_sum.dylib重命名为string_sum.so,在Windows上将libstring_sum.dll重命名为string_sum.pyd,在Linux上将libstring_sum.so重命名为string_sum。 。所以。然后,在同一文件夹中打开Python shell,您将能够导入string_sum。

要将板条箱作为Python模块构建,测试和发布,可以使用maturin或setuptools-rust。您可以在示例/字数统计中找到setuptools-rust的示例,而maturin应该无需任何配置即可在您的箱子上使用。

如果您希望Rust应用程序在内部创建一个Python解释器并使用它运行Python代码,请像这样将pyo3添加到您的Cargo.toml中:

使用pyo3 :: prelude :: *;使用pyo3 :: types :: IntoPyDict; fn main()->结果<(),()> {Python :: with_gil(| py | {main_(py)。map_err(| e | {//我们无法通过std :: fmt :: Display显示Python异常,因此请在此处手动打印错误。 e。print_and_set_sys_last_vars(py);})})}} fn main_(py:Python)-> PyResult<()> {让sys = py。 import(" sys")? let version:字符串= sys。 get(" version")?。提取()?;让当地人= [(" os&#34 ;, py.import(" os")?)]。 into_py_dict(py);让代码=" os.getenv(' USER')或os.getenv(' USERNAME')或' Unknown'&#34 ;;让用户:字符串= py。 eval(代码,无,某些(& locals))?提取()?; println!(" Hello {},我是Python {}&#34 ;,用户,版本);行(())}

mocpy天文Python库提供用于描述单位球面上任意覆盖范围的数据结构