0
0

PythonのコードをRustから使う その2 (返り値を受け取る)

Last updated at Posted at 2024-06-12

この記事の続きです。

概要

関数の返却値を受け取ります。
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を使って失敗を適切に処理してほしい。

次の記事

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0