Open1
RustからPythonを呼び出すことは可能でしょうか?
Q. RustからPythonを呼び出すことは可能でしょうか?
A.
はい、RustからPythonを呼び出すことは可能です。これには、ctypesやcffiのようなPythonのC拡張ライブラリを使うか、rust-cpythonやpyo3といったRustのライブラリを使ってPythonのコードを呼び出すことができます。
rust-cpythonとpyo3は、RustとPython間でデータとコードのやりとりを容易にするためのライブラリで、どちらも似たような機能を提供しています。ただし、pyo3はより最近開発されたライブラリで、よりアクティブな開発が行われています。以下は、pyo3を使用してRustからPythonコードを呼び出す例です。
まず、Cargo.tomlファイルにpyo3とpyo3-builtinsを追加してください。
toml
[dependencies]
pyo3 = { version = "0.14", features = ["extension-module"] }
次に、RustコードでPythonコードを呼び出す方法を示します。
rust
use pyo3::prelude::*;
use pyo3::types::IntoPyDict;
fn main() -> Result<(), PyErr> {
let gil = Python::acquire_gil();
let py = gil.python();
let code = "def add(a, b): return a + b";
let locals = [("__name__", "__main__")].into_py_dict(py);
py.run(code, None, Some(locals))?;
let add_fn = locals.get_item("add").unwrap();
let result: i32 = add_fn.call1((3, 5))?.extract()?;
println!("Result: {}", result);
Ok(())
}
この例では、PythonのGIL(Global Interpreter Lock)を取得し、Pythonコードを実行しています。そして、Pythonのadd関数を呼び出し、結果をRustの整数型に変換しています。
これらのライブラリを使うことで、RustとPythonの間でデータやコードをやり取りすることが可能になります。ただし、パフォーマンスや安全性には注意が必要です。GILの取得やリリースは、特にマルチスレッド環境ではコストがかかる場合があります。また、PythonとRustの間でデータを変換する際にも、型変換の誤りやメモリリークに注意する必要があります。