한국어
파이썬
 

General pybind11 에 대해서

makersweb 2023.07.23 12:36 조회 수 : 4390

pybind11은 주로 기존 C++ 코드의 Python 바인딩을 생성하기 위해 Python에 C++ 타입을 노출하고 그 반대로 노출하는 경량의 헤더 전용 라이브러리이다.

Boost.Python 라이브러리와 유사하다. 컴파일 시간 검사를 사용하여 타입 정보를 유추하고 기존 확장 모듈의 상용구 코드를 최소화한다. Boost.Python과 유사한 이 프로젝트가 시작된 이유는 Boost 에 있다. Boost는 존재하는 거의 모든 C++ 컴파일러와 함께 작동하는 엄청나게 크고 복잡한 유틸리티 라이브러리 모음이다. 즉, Python 바인딩만을 원할 때 지나치게 크고 불필요한 종속성이 많다고 볼 수 있다. (Boost.Python 바인딩에 대한 내용은 이전에 다룬 적이 있다.)
pybind11은 바인딩 생성과 관련이 없는 모든 것이 제거된 작은 Boost.Python 자체만 있는 버전으로 생각하면 된다. 여러 가지 면에서 Boost.Python 대비 많은 일반적인 상황에서 바인딩 코드를 훨씬 더 간단하게 만들었다.

pybind11은 BSD 스타일 라이선스에 따라 제공되고 Python(3.6+ 또는 PyPy) 및 C++ 표준 라이브러리에 의존한다.

빠르게 시작하기

빠르게 시작할 수 있도록 python_example 및 cmake_example 를 제공한다. 이것은 좋은 시작점이 될 수 있다.
두가지 프로젝트 사이의 유일한 차이점은 python_example은 Python의 설정 도구를 사용하여 모듈을 빌드하는 반면 cmake_example은 CMake(기존 C++ 프로젝트에 더 적합할 수 있음)를 사용한다는 것이다.

cmake_example 을 실행해보려면 이 저장소를 복제하고 pip 설치를 하면 된다. --recursive 옵션으로 하위 모듈로 pybind11을 가져온다.

git clone --recursive https://github.com/pybind/cmake_example.git
pip install ./cmake_example

빌드까지 성공하면 Python으로 가져올 수 있는 이진 모듈 파일이 생성된다. 다음은 현재 디렉터리에 있다고 가정하고 다음 대화형 Python 세션에서 예제를 로드하고 실행하는 방법을 보여준다.

E:\project\python>python
Python 3.11.4 (tags/v3.11.4:d2340ef, Jun  7 2023, 05:45:37) [MSC v.1934 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cmake_example
>>> cmake_example.add(123,321)
444
>>>

간단한 함수에 대한 바인딩

두 개의 숫자를 더하고 그 결과를 반환하는 매우 간단한 함수에 대한 Python 바인딩을 생성하는 것으로 시작하자.

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

간단하게 하기 위해 이 함수와 바인딩 코드를 모두 example.cpp라는 파일에 작성한다.

#include <pybind11/pybind11.h>

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

PYBIND11_MODULE(example, m) {
    m.doc() = "pybind11 example plugin"; // optional module docstring

    m.def("add", &add, "A function that adds two numbers");
}

PYBIND11_MODULE() 매크로는 Python 내에서 가져오기 문이 실행될 때 호출될 함수를 만든다. 모듈 이름(example)은 첫 번째 매크로 인수로 제공된다(따옴표 안에 있으면 안 됨). 두 번째 인수(m)는 바인딩 생성을 위한 기본 인터페이스인 py::module_ 유형의 변수를 정의한다. module_::def() 메서드는 add() 함수를 Python에 노출하는 바인딩 코드를 생성한다.

pybind11은 헤더 전용 라이브러리이므로 특수 라이브러리에 연결할 필요가 없으며 중간(매직) 변환 단계가 없다. Linux에서 위의 예제는 다음 명령을 사용하여 컴파일할 수 있다.

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

위의 C++ 코드를 빌드하면 Python으로 가져올 수 있는 바이너리 모듈 파일이 생성된다. 컴파일된 모듈이 현재 디렉터리에 있다고 가정하면 다음 대화형 Python 세션은 예제를 로드하고 실행하는 방법을 보여준다.

$ python
Python 3.9.10 (main, Jan 15 2022, 11:48:04)
[Clang 13.0.0 (clang-1300.0.29.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import example
>>> example.add(1, 2)
3
>>>

더 많은 사용방법은 공식 문서에서 찾을 수 있다.

번호 제목 글쓴이 날짜 조회 수
» pybind11 에 대해서 makersweb 2023.07.23 4390
23 Qt For Python(PySide2) QML 프로젝트 예제 file makersweb 2019.10.17 6014
22 명령어 한줄로 내컴퓨터를 웹서버로 file 운영자 2019.01.25 4751
21 pydbus 바인딩을 이용하여 서비스 데몬과 D-Bus통신 file makersweb 2018.03.12 3297
20 Boost Python을 이용하여 python을 위한 C++ API 바인딩 [5] file makersweb 2017.01.08 10496
19 [Python]EXE또는 DLL파일의 버전정보를 알아내기위한 몇가지 방법 makersweb 2015.06.25 9952
18 QML 및 Window 투명처리 file makersweb 2015.04.22 5218
17 [pyqt4]QTimer 예제 - 버튼을 누르면 3초후 함수 또는 메소드 호출 makersweb 2015.04.01 10872
16 Python + QML with PyQt4 makersweb 2015.03.24 9013
15 print를 로그파일로 생성하기 (log출력 Redirection) makersweb 2015.03.18 6736
14 외부 프로그램 실행 pjk 2015.02.10 16464
13 우분투에 Python새 버전 설치 사용법 pjk 2015.02.10 4292
12 How to Use Freeze pjk 2014.09.06 5866
11 [PyQt4]개발 프로그램 버전표시 메세지 박스 pjk 2014.09.02 8613
10 [PyQt4]여러가지 버튼 예제 file pjk 2014.08.29 15196
9 Python 문자열 관련 함수 레퍼런스 pjk 2014.08.29 7895
8 [PyQt4]스레드 및 ProgressBar 예제 코드 file pjk 2014.08.26 8956
7 [PyQt4]multiprocess 예제 코드 pjk 2014.08.26 8747
6 [PyQt4]마우스 클릭 이벤트 예제 코드 pjk 2014.08.26 7435
5 [PyQt4]폴더 또는 파일을 드레그하여 그 경로를 LineEdit로 가져오기 file pjk 2014.08.22 14332