파이썬에서 Rust 코드 실행하기: PyO3의 활용 방법

Rust는 안전하고 성능이 우수한 시스템 프로그래밍 언어로 알려져 있습니다. 이러한 이점을 활용하여 파이썬에서 Rust 코드를 실행할 수 있는 방법을 알아보겠습니다. 이를 가능하게 해주는 도구는 PyO3입니다. PyO3는 파이썬과 Rust 사이의 인터페이스를 제공하여 파이썬에서 Rust 코드를 호출하고 실행할 수 있는 기능을 제공합니다.

PyO3란?

PyO3는 Rust에서 작성된 파이썬 바인딩을 생성하는 라이브러리입니다. 이 라이브러리를 사용하면 Rust 코드를 통해 파이썬의 런타임에 직접 접근할 수 있으며, 파이썬과 Rust 간에 데이터를 효율적으로 공유할 수 있습니다. PyO3를 사용하면 파이썬 코드와 Rust 코드를 함께 사용하여 안전하고 빠른 시스템을 개발할 수 있습니다.

PyO3 설치하기

먼저 PyO3를 설치해야 합니다. PyO3는 표준 Rust 패키지 매니저인 Cargo를 통해 설치할 수 있습니다. 다음 명령을 사용하여 PyO3를 설치하세요.

$ cargo install pyo3

Rust 코드 작성하기

PyO3를 사용하여 파이썬에서 호출할 수 있는 Rust 코드를 작성해 보겠습니다. 다음은 간단한 Rust 함수의 예입니다.

#[macro_use] extern crate pyo3;

use pyo3::prelude::*;

#[pymodule]
fn mymodule(py: Python, m: &PyModule) -> PyResult<()> {
    #[pyfn(m, "square")]
    fn square_py(py: Python, x: usize) -> PyResult<usize> {
        Ok(x * x)
    }

    m.add_function(wrap_pyfunction!(square_py, m)?)?;

    Ok(())
}

#[cfg(test)]
mod tests {
    use super::*;
    use pyo3::types::IntoPyDict;
    use pyo3::types::PyString;

    #[test]
    fn test_square() {
        let gil = Python::acquire_gil();
        let py = gil.python();
        let m = PyModule::new(py, "mymodule").unwrap();
        mymodule(py, &m).unwrap();
        let dict = [("mymodule", m)].into_py_dict(py);

        let result = py
            .eval("import mymodule\nmymodule.square(5)", Some(dict), None)
            .unwrap();

        assert_eq!(result.extract::<usize>().unwrap(), 25);
    }
}

위의 코드는 Rust에서 PyO3 라이브러리를 사용하여 mymodule이라는 파이썬 모듈을 생성하는 예제입니다. square_py라는 함수는 임의의 숫자를 받아 제곱한 결과를 반환합니다.

파이썬에서 Rust 코드 호출하기

이제 작성한 Rust 코드를 파이썬에서 호출해 보겠습니다. 다음은 Rust 코드를 사용하는 간단한 파이썬 스크립트입니다.

import mymodule

result = mymodule.square(5)
print(result)

위의 코드를 실행해 보면 25라는 결과가 출력될 것입니다.

결론

PyO3는 파이썬과 Rust 간의 효율적인 상호 작용을 가능하게 해주는 뛰어난 라이브러리입니다. 이를 활용하여 Rust의 안전성과 성능을 파이썬 프로젝트에 적용할 수 있습니다. Rust의 강력한 기능과 파이썬의 생산성을 결합하여 더욱 강력한 애플리케이션을 개발하는 데 도움이 될 것입니다.


Reference: