この記事の続きです。
概要
関数の返却値を受け取ります。
Python::with_gilの中の値を外に出すのではなく、キャプチャしたmutableな変数に代入してやる方が安全のようです。
src/main.rsを変更してみます。
use pyo3::prelude::*; // 主要なモジュール
fn main() {
let mut rust_value: i64 = 0; // 結果を受け取るための変数
// Python::with_gilでPython環境呼び出す
let pyresult = Python::with_gil(|py| -> PyResult<Py<PyAny>> {
// ここでコードをモジュールとしてロード。ロードした時にグローバルに置いたprintの行が実行される
let module = PyModule::from_code_bound(py,
r#"
print("Hello, World from Python!")
def function1():
print("function1() called. returns 5.")
return 5
"#
, "", "")?;
// ここでモジュールの中のfunction1にアクセスできるようになる
let app_func: Py<PyAny> = module.getattr("function1")?.into();
// 引数なしの関数として呼び出して返却値をそのまま返す。
let func_result = app_func.call0(py)?;
rust_value = func_result.clone().extract(py)?; // 結果をi64に変換する
Ok(func_result)
});
println!("pyresult is {pyresult:?}");
println!("rust_value is {rust_value:?}");
}
実行
$ cargo run
Hello, World from Python!
function1() called. returns 5.
pyresult is Ok(Py(0x1030a1238))
rust_value is 5
もちろん、ResultやOptionを使って失敗を適切に処理してほしい。
次の記事