0%

PyO3란

rust를 python에서 바인딩하여 사용할 수 있도록 도와주는 PyO3에 대해서 정리합니다. 해당 글은 PyO3 공식문서를 바탕으로 작성되었습니다.

사용목적

현재 러스트로 작성하고 있는 프로젝트인 tossicat를 파이썬에서도 사용할 수 있도록 패키지를 생성하고자 한다.

PyO3란

PyO3은 러스트 코드를 파이썬으로 바인딩하는 모듈이다. 해당 깃허브에 접속해보면 알겠지만 모듈 대부분이 rust로 개발되고 있으며, 자세한 내용은 Rust crate 문서공식 가이드에서 찾아볼 수 있다. 해당 모듈을 사용하여 Rust에서 기본 Python 모듈을 작성하거나 Python을 Rust 프로그램에서 실행할 수 있다.

maturin 사용법

maturin이란 PyO3를 통해서 러스트 코드를 보다 편리하게 파이썬 패키지로 빌드할 수 있도록 도와주는 도구이다. maturin은 기본적으로 virtualenv에서 작동한다. 아래는 maturin에서 기본적으로 사용하는 명령어이다.

  • maturin init: 튜토리얼에서 사용할 예시 코드를 가져온다.
  • maturin new: 새로운 cargo 프로젝트를 생성한다.
  • maturin develop: 러스트 코드를 파이썬 패키지로 빌드하고 virtualenv에 바로 설치한다.
  • maturin build: target/wheels(default) 경로에 파이썬 패키지 wheel파일로 빌드한다.
  • maturin publis: 작성한 러스트 코드를 파이썬 패키지로 빌드하고 PyPi에 배포한다.

PyO3 튜토리얼

공식문서의 튜토리얼을 따라해보자. 원하는 경로에서 아래의 코드를 순서대로 입력한다.

1
2
3
4
5
6
7
8
9
10
# 먼저 사용할 폴더 만들기
$ mkdir string_sum
# 폴더로 이동
$ cd string_sum
# 파이썬 가상환경 생성
$ python3 -m venv .env
# 생성한 가상환경으로 접속
$ source .env/bin/activate
# 필요한 패키지 설치
$ pip3 install maturin

완료되었다면 필요한 환경설정은 끝났다. 다음으로 아래의 코드를 입력한 후 pyo3를 선택한다.

1
2
3
4
5
6
7
$ maturin init

? 🤷 Which kind of bindings to use? ›
❯ pyo3
rust-cpython
cffi
bin

그러면 아래와 같이 프로젝트가 생성되었다는 안내가 출력된다.

1
✨ Done! Initialized project {PATH}/string_sum

튜토리얼을 진행하면 바로 패키지 개발을 테스트 해볼 수 있는 코드들이 /src/lib.rs, cargo.toml에 작성되어 있다.
아래의 명령어를 입력해서 테스트 해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
$ maturin develop

🔗 Found pyo3 bindings
🐍 Found CPython 3.9 at {PATH}/string_sum/.env/bin/python
Compiling target-lexicon v0.12.4
Compiling once_cell v1.12.0
.
.
Compiling pyo3-macros v0.16.5
Compiling string_sum v0.1.0 ({PATH}/string_sum)
Finished dev [unoptimized + debuginfo] target(s) in 19.69s
📦 Built wheel for CPython 3.9 to {PATH}/string_sum-0.1.0-cp39-cp39-macosx_10_7_x86_64.whl
🛠 Installed string_sum-0.1.0

가상환경에 해당 패키지가 파이썬 모듈로 설치되었다. 파이썬에 직접 접속해서 빌드한 string_sum패키지를 사용해보자.

1
2
3
4
$ python3
>>> import string_sum
>>> string_sum.sum_as_string(10,5)
'15'

정상적으로 작동하는 것을 확인할 수 있다. 만약 러스트 코드를 수정해야 한다면 수정 후 다시 maturin develop을 입력하여 컴파일 후 테스트 해볼 수 있다.
또한 아래의 명령어를 사용하여 패키지wheel파일로 저장할 수 있다.

1
maturin build