2023년 9월 23일 토요일

python pybind 11 c++ 과 연결하기

pybind 라는 패키지가 있다.

c++과 연결하는 것인데, header only library이고,

아래 페이지가 해당 사이트이다. 
https://github.com/pybind/pybind11

기존에는 ctype등을 이용해서 주로 python과 C를 연결했었는데, 
이것은 C++과 다이렉트로 연결해주는 패키지이다. 
이전에도 C++은 python과 바로 연결은 안되고, extern이라든지 c형태로 함수를 다시 재구성해서 노출시키는 방법들을 사용했었는데, 이것은 간단한 작성으로 이런것들을 가능하게 해주는듯하다. 

이전에 Boost.Python이 그런역할을 해주는데, 부스트라는게 사실 좀 헤비한 면이 없지 않은지라 header only에 standard c++만 사용한 이 패키지도 나쁘지는 않은듯하다. 


먼저 pybind설치

>> pip install pybind11 

아래와 같이 c-code를 작성한다. example.cpp

#include <pybind11/pybind11.h>

int add(int i, int j) {
    return i + j;
}

namespace py = pybind11;

PYBIND11_MODULE(example, m) {
    m.doc() = "pybind11 example plugin"; // 모듈 독스트링 설정

    m.def("add", &add, "A function which adds two numbers"); // 함수 바인딩
}

이것을 다음과 같이 컴파일 header-only이기때문에 python3 -m pybind11 --includes 이 명령어를 통해서 관련 헤더가 추가된다.


c++ -O3 -Wall -shared -std=c++11 -fPIC `python3 -m pybind11 --includes` example.cpp -o example`python3-config --extension-suffix`

아래와 같이 python 에서 불러들이면 끝

import example

result = example.add(1, 2)
print(result)  
# 출력: 3

위와 같이 간단하게 python에서 c-code를 실행시키는 코드를 만들수 있다.


댓글 없음:

댓글 쓰기