2 回答

TA貢獻1793條經驗 獲得超6個贊
由于沒有解決此問題的簡單方法(至少,我還沒有找到),我將我的異步方法轉換為同步方法。并在 Python 方面將其稱為,
async fn my_method(s: &str) -> Result<String, Error> {
// do something
}
#[pyfunction]
fn my_sync_method(s: String) -> PyResult<String> {
let mut rt = tokio::runtime::Runtime::new().unwrap();
let mut contents = String::new();
rt.block_on(async {
result = format!("{}", my_sync_method(&s).await.unwrap()).to_string();
});
Ok((result))
}
#[pymodule]
fn MyModule(py: Python, m: &PyModule) -> PyResult<()> {
m.add_wrapped(wrap_pyfunction!(my_sync_method))?;
Ok(())
}
已編輯
在Cargo.toml文件中,我添加了以下依賴項,
[dependencies.pyo3]
git = "https://github.com/PyO3/pyo3"
features = ["extension-module"]
運行后cargo build --release生成target/release/libMyModule.so二進制文件。將其重命名為MyModule.so,現(xiàn)在可以從 Python 導入它。
import MyModule
result = MyModule.my_sync_method("hello")
使用setuptools-rust,我可以將它捆綁為一個普通的 Python 包。
以上所有代碼和命令都在新發(fā)布的 Linux Mint 20 上進行了測試。在 MacOS 上,二進制文件將為libMyModule.dylib.

TA貢獻1796條經驗 獲得超10個贊
如果你想使用 Python 來控制 Rust 的異步功能,我認為它不會起作用(或者至少它非常復雜,因為你需要連接兩種不同的future
機制)。對于異步函數(shù),Rust 編譯器將維護一個狀態(tài)機來管理在 await 的控制下正確運行的協(xié)程。這是 Rust 應用程序的內部狀態(tài),Python 無法觸及它。同樣,Python 解釋器也有 Rust 無法觸及的狀態(tài)機。
我確實找到了有關如何使用 FFI 導出異步函數(shù)的主題。主要思想是將異步包裝在 a 中BoxFuture
,讓 C 控制將其返回給 Rust 的時間。但是,您不能BoxFuture
在 PyO3 中使用,因為它的pyfunction
宏不能將函數(shù)返回轉換BoxFuture
為 Python 回調。您可以嘗試使用 FFI 創(chuàng)建一個庫并使用 python 的 cffi 模塊來加載它。
添加回答
舉報