PyO3 튜토리얼: Rust로 파이썬 모듈 만들기

Rust와 Python은 각각 뛰어난 장점을 가지고 있는 프로그래밍 언어입니다. Rust는 안정성과 속도에 강점을 가지고 있고, Python은 간결하고 생산적인 언어로 유명합니다. 이 두 언어의 장점을 혼합하여 Rust로 파이썬 모듈을 만드는 것이 가능합니다. 이를 가능케 해주는 도구중 하나가 PyO3입니다.

PyO3는 Rust와 Python 코드를 혼합할 수 있도록 도와주는 라이브러리입니다. 이 튜토리얼에서는 PyO3를 사용하여 Rust로 파이썬 모듈을 작성하는 방법을 알아보겠습니다.

준비 사항

이 튜토리얼을 따라하기 위해서는 Rust와 Python이 이미 설치되어 있어야 합니다. 또한, rustup을 사용하여 Rust 관리 도구를 설치해야 합니다.

프로젝트 설정

먼저, Rust로 파이썬 모듈을 만들기 위한 프로젝트를 생성해야 합니다. 다음 명령어를 실행하여 프로젝트를 생성합니다.

$ cargo new pyo3_example

프로젝트 디렉토리로 이동하여 Cargo.toml 파일을 엽니다.

$ cd pyo3_example
$ vim Cargo.toml

다음과 같이 [dependencies] 섹션에 pyo3 라이브러리를 추가합니다.

[dependencies]
pyo3 = "0.15"

Cargo.toml 파일을 저장하고 닫습니다.

코드 작성

이제 Rust 코드를 작성하여 파이썬 모듈을 만들어보겠습니다. 프로젝트 디렉토리에 src/lib.rs 파일을 생성합니다.

$ vim src/lib.rs

다음 코드를 lib.rs 파일에 작성합니다.

use pyo3::prelude::*;
use pyo3::types::IntoPyDict;

#[pymodule]
fn hello(py: Python, m: &PyModule) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(say_hello, m)?)?;

    let locals = [("name", "world")].into_py_dict(py);
    m.add("__name__", "hello")?;
    m.add("__doc__", "A simple hello module.")?;
    m.add("__builtins__", py.ImportModule::new("builtins")?)?;
    py.run("from time import time")?;
    py.run("print(f'Hello, {name}! The current time is {time()}')", Some(locals), None)?;

    Ok(())
}

#[pyfunction]
fn say_hello(name: &str) {
    println!("Hello, {}!", name);
}

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

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

#[pymodule]
fn pyo3_example_lib(py: Python, m: &PyModule) -> PyResult<()> {
    m.add_function(wrap_pyfunction!(my_module, m)?)?;

    Ok(())
}

#[pymodule]
fn pyo3_example_core(_py: Python, m: &PyModule) -> PyResult<()> {
    Ok(())
}

#[pymodule]
fn pyo3_example(_py: Python, m: &PyModule) -> PyResult<()> {
    m.add_module(pyo3_example_lib)?;
    m.add_module(pyo3_example_core)?;
    Ok(())
}

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

    #[test]
    fn test_say_hello() {
        let gil = Python::acquire_gil();
        let py = gil.python();
        say_hello("World");
    }
}

lib.rs 파일을 저장하고 닫습니다.

빌드 및 실행

Rust 코드를 작성했으므로 이제 빌드하고 실행해보겠습니다. 다음 명령어를 실행하여 프로젝트를 빌드합니다.

$ cargo build --release

빌드가 성공하면 target/release 디렉토리에 libpyo3_example.so 라이브러리가 생성됩니다.

파이썬 스크립트에서 이 라이브러리를 사용하기 위해 다음과 같이 스크립트를 작성합니다.

import pyo3_example

pyo3_example.my_module.hello.say_hello("Rust")

위 스크립트를 실행하면 Rust로 작성한 코드가 실행되어 “Hello, Rust!”가 출력됩니다.

결론

PyO3를 사용하여 Rust로 파이썬 모듈을 작성하는 방법을 알아보았습니다. Rust와 Python의 장점을 혼합하여 안정성과 성능을 동시에 갖출 수 있는 유용한 기술입니다. PyO3를 사용하면 두 언어를 쉽게 혼합하여 사용할 수 있으며, 생산적이고 빠른 개발이 가능해집니다.

더 많은 예제와 자세한 정보는 PyO3 공식 문서를 참고하시기 바랍니다.

#rust #python