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: