![](/img/trans.png)
[英]How to pass a Rust function as a callback to Python using pyo3
[英]How to call a Rust function from a Python file using pyo3?
我正在開發一個視頻游戲,我需要在其中從 Python 文件設置 Rust 對象(例如,添加一個帶有texture:"", coords:"", text:"", action:""
的按鈕texture:"", coords:"", text:"", action:""
)。
我正在使用 pyo3 crate 來鏈接 Python 和 Rust。 我成功地從我的 Rust 代碼調用 Python 腳本,但我找不到如何從 Python 文件調用 Rust 函數。
執行我的 Python 腳本的 Rust 代碼:
fn main() -> PyResult<()> {
let gil = Python::acquire_gil();
let py = gil.python();
let script = fs::read_to_string("deep_hello.py")?;
println!("RUNNING :\n[\n{}]", script);
py.run(&script, None, None)
}
我想從我的 Python 腳本調用的 Rust 函數:
/// hello_from_rust(/)
/// --
///
/// This function prints hello because she is very nice.
#[pyfunction]
fn hello_from_rust() {
println!("Hello from rust from python !");
}
我的 Python 腳本:
hello_from_rust()
我得到這個輸出:
RUNNING :
[
hello_from_rust()
]
Error: PyErr { type: Py(0x7f9cdd1e9580, PhantomData) }
如果我正確理解了您的問題,那么您嘗試執行的操作包括三個步驟:
hello_from_rust()
的 Python 模塊deep_hello.py
使用它deep_hello.py
。我無法完全重現您的問題,但問題的根源似乎在第一步或第二步。
從PyO3 文檔中,我希望hello_from_rust()
位於定義 Python 模塊的 Rust 文件中,該模塊如下所示:
use pyo3::prelude::*;
use pyo3::wrap_pyfunction;
#[pyfunction]
fn hello_from_rust() {
println!("Hello from rust from python !");
}
#[pymodule]
fn hello_module(py: Python, m: &PyModule) -> PyResult<()> {
m.add_wrapped(wrap_pyfunction!(hello_from_rust));
Ok(())
}
您可以使用 Cargo 將其構建到 Python 模塊中(請參閱此處;根據您的操作系統,說明略有不同)並將生成的.so
(Linux 或 MacOS)或.pyd
(Windows)文件放在與您的 Python 腳本相同的目錄中。
你必須創建一個類似於hello_module
來初始化你的 Python 模塊。 如果不這樣做,您的 Rust 庫可能仍會編譯,但您將無法導入hello_from_rust
。
您的deep_hello.py
腳本應如下所示:
import hello_module
hello_module.hello_from_rust()
確保.so
或.pyd
文件可在您的PYTHON_PATH
訪問(例如,將其放在與腳本相同的目錄中),使用 Python >= 3.5 運行deep_hello.py
應該可以工作。 (請注意,您的系統 Python 可能是 Python 2,因此您可能希望使用較新版本的 Python 創建一個 Anaconda 環境並在其中工作。)
對我來說,遵循這些步驟就成功了。
(ruspy) ruspy $ python deep_hello.py
Hello from rust from python !
確保你記得在你的 Python 腳本中import hello_module
! 該PyErr
返回由您py.run(&script, None, None)
使我懷疑這個問題實際上是在你的Python腳本,而事實上我希望hello_from_rust()
沒有前from deep_hello import *
產生NameError
,即使你正確地組合了你的deep_hello
模塊。
我不完全確定您為什么要這樣做,但是您現在應該可以從 Rust 運行deep_hello.py
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.