PyO3로 파이썬과 Rust 사이의 모듈 인터페이스 구축하기

PyO3는 파이썬과 Rust 사이에서 모듈 인터페이스를 구축하기 위한 강력한 도구입니다. 이를 통해 Rust로 작성된 기능을 파이썬에서 직접 사용할 수 있게 됩니다. PyO3를 사용하면 CPython API에 대한 지식이 필요 없이 Rust 함수를 파이썬에서 호출하고 파이썬 객체를 Rust에서 처리할 수 있습니다.

PyO3 설치

먼저 PyO3를 설치해야 합니다. 아래와 같은 명령어로 PyO3를 설치할 수 있습니다.

$ cargo install PyO3

Rust로 PyO3 모듈 작성하기

다음으로, PyO3를 사용하여 Rust로 파이썬 모듈을 작성해 보겠습니다. 아래와 같은 예시 코드를 Rust 파일에 작성합니다.

use pyo3::prelude::*;

#[pymodule]
fn my_module(_py: Python, m: &PyModule) -> PyResult<()> {
    #[pyfn(m, "multiply")]
    fn multiply_py(_: Python, a: i32, b: i32) -> PyResult<i32> {
        Ok(a * b)
    }
    
    m.add_function(wrap_pyfunction!(multiply_py, m)?)?;
    Ok(())
}

#[pymodule]
fn rusty_py(_py: Python, m: &PyModule) -> PyResult<()> {
    m.add_function::<fn(_)>(pyo3::wrap_pyfunction!(my_module, m)?)?;
    Ok(())
}

#[pymodule]
#[allow(non_snake_case)]
fn my_python_module(_py: Python, m: &PyModule) -> PyResult<()> {
    rusty_py(_py, m)?;
    Ok(())
}

#[pymodule]
fn my_module_init(py: Python, m: &PyModule) -> PyResult<()> {
    m.add_module(my_python_module(py, m)?)?;
    Ok(())
}

#[pymodule]
fn my_module_wrapper(py: Python, m: &PyModule) -> PyResult<()> {
    m.add_module(my_module_init(py, m)?)?;
    Ok(())
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_multiply() {
        let gil = Python::acquire_gil();
        let py = gil.python();
        let module = my_module_init(py, &PyModule::new(py, "my_module").unwrap()).unwrap();
        let result = module.call(py, "multiply", (2, 3)).unwrap().extract::<i32>().unwrap();
        assert_eq!(result, 6);
    }
}

위 코드에서는 multiply 함수를 구현하고, 이를 my_module에 등록합니다. 그리고 rusty_py 모듈에 my_module 함수를 포함시키고, my_python_module 모듈을 생성하여 rusty_py 모듈을 포함시킵니다. 최종적으로 my_module_wrapper 모듈을 생성하여 my_module_init을 포함시킵니다.

파이썬에서 Rust 모듈 사용하기

이제 Rust로 작성한 모듈을 파이썬에서 사용해 보겠습니다. 아래 예시 코드를 파이썬 스크립트에 작성합니다.

import my_module_wrapper

result = my_module_wrapper.my_module.multiply(2, 3)
print(result)  # 출력: 6

위 예시 코드에서는 my_module_wrapper 모듈을 import한 후, my_module_wrapper.my_module.multiply 함수를 호출하여 Rust 모듈의 multiply 함수를 사용합니다. 결과로 6이 출력됩니다.

결론

PyO3를 사용하면 파이썬과 Rust 사이에서 모듈 인터페이스를 구축할 수 있습니다. 이를 통해 파이썬에서 Rust 함수를 직접 호출하고 파이썬 객체를 Rust에서 처리할 수 있습니다. PyO3는 파이썬 및 Rust 개발자들에게 매우 유용한 도구입니다.

#rust #python

참고 문서: