我想在Python中使用一个Rust fixc方法。我正在尝试使用PyO3或rust-cpython。
例如,对于同步Rust函数,我可以使用,
#[pyfunction]
fn myfunc(a: String) -> PyResult<String> {
let mut contents = String::new();
contents = a.to_string() + " appended";
Ok((contents))
}
#[pymodule]
fn MyModule(py: Python, m: &PyModule) -> PyResult<()> {
m.add_wrapped(wrap_pyfunction!(urlshot))?;
Ok(())
}
字符串
对于python方法,我该怎么做呢?例如,我想在Python中调用下面的方法,
async fn hello_world() {
println!("hello, world!");
}
型
3条答案
按热度按时间sg24os4d1#
由于没有简单的方法来解决这个问题(至少,我没有找到),我将我的python c方法转换为sync方法。并在Python端将其称为:
字符串
在
Cargo.toml
文件中,我添加了以下依赖项:型
运行
cargo build --release
后,生成target/release/libMyModule.so
二进制文件。将其转换为MyModule.so
,现在可以从Python导入。型
使用setuptools-rust,我可以将其捆绑为普通的Python包。
上述所有代码和命令都在新发布的Linux Mint 20上进行了测试。在MacOS上,二进制文件将是
libMyModule.dylib
。l2osamch2#
如果你想用Python来控制Rust的python c函数,我认为这是行不通的。(或者至少它是非常复杂的,因为你需要连接两个不同的
future
机制).对于mixc函数,Rust编译器将维护一个状态机来管理在await的控制下正确运行的协程。这是Rust应用程序的内部状态,Python无法触及它。类似地,Python解释器也有一个Rust不能触及的状态机。我确实找到了this topic关于如何使用FFI导出一个masc函数。主要思想是将masc Package 在
BoxFuture
中,让C控制返回Rust的时间。然而,你不能在PyO3中使用BoxFuture
,因为它的pyfunction
宏不能将函数返回BoxFuture
转换为Python回调。你可以尝试使用FFI创建一个库,并使用python的cffi模块来加载它。fkaflof63#
我在pyo 3文档中找到了这个教程:https://pyo3.rs/v0.20.0/ecosystem/async-await
如果你需要调用一个从Python返回结果(String,None等)的Rust函数,似乎你需要访问Python的GIL:
lib.rs
字符串
example.py
型
要从函数返回一个字符串:
型