pybind11의 힘은 pybind11의 readme의 다음 인용에 의해 포착됩니다.
PYBIND11은 Python에서 C ++ 유형을 노출시키는 가벼운 헤더 전용 라이브러리이며, 주로 기존 C ++ 코드의 Python 바인딩을 생성합니다. 목표와 구문은 David Abrahams의 탁월한 Boost.python Library와 유사합니다.
Boost.Python의 주요 문제와 유사한 프로젝트를 만드는 이유는 Boost입니다. Boost는 존재하는 거의 모든 C ++ 컴파일러와 함께 작동하는 엄청나게 크고 복잡한 유틸리티 라이브러리 제품군입니다. ... 이제 C ++ 11- 호환 컴파일러가 널리 사용 가능 하므로이 중장기는 지나치게 크고 불필요한 의존성이되었습니다.
이 저장소에는 pybind11의 사용에 대한 몇 가지 예가 포함되어 있습니다. PYBIND11의 개발자가 제공 한 온라인 문서는이를 사용하여 비교적 간단하지만 여기에 제공된 몇 가지 예는 PYBIND11을 사용하기 쉽게 만듭니다. 이 예는 Pybind11로 더 빨리 시작하기위한 것입니다. 그러나 그들은 결코 철저하지 않으며 항상 최적의 선택을 제공하지는 않습니다. 그러므로 스스로 생각하는 것이 좋습니다. 또한, 유사한 간단한 예제 (또는 기존 예제를 더욱 개선함으로써)가 포함 된 기여는 매우 환영합니다 . GitHub에 풀 요청 또는 문제를 제출하거나 저에게 연락하십시오.
크레딧이 마감되는 곳에 신용을 제공하기 위해 :
Pybind11의 제작자는 훌륭한 일을했습니다! 사용하기 쉽고 매우 가볍습니다. 또한 문서는 이미 매우 완성되었습니다.
Duke University의 Cliburn Chan과 Janice McCarthy가 제공 한 사례는 엄청난 도움이되었습니다. 또한 문서를 읽으십시오.
PYBIND11 저장소의 예제로 두 배가되는 테스트 사례도 있지만 PYBIND11을 처음 접할 때는 그다지 통찰력이 없습니다.
마지막으로, pybind11은 적극적으로 사용됩니다. 따라서 특정 솔루션을 위해 적극적으로 유지 관리 된 라이브러리를 볼 수 있습니다. 예를 들어:
pybind11 모듈 (헤더 전용!) 은이 저장소의 서브 모드로 포함됩니다. 이 프로젝트를 복제 할 때는 약간의 관심이 필요합니다. 두 가지 옵션이 있습니다.
가장 간단한 옵션은 다음과 같습니다.
git clone --recursive https://github.com/tdegeus/pybind11_examples.git이 프로젝트에 사용 된 버전까지 하위 모듈을 다운로드합니다. 하위 모듈 자체의 최신 커밋으로 업데이트하려면 :
git submodule update --remote소스에서 하위 모듈을 직접 다운로드 할 수도 있습니다.
git clone https://github.com/tdegeus/pybind11_examples.git
cd pybind11_examples
git submodule init
git submodule updateEigen 라이브러리는 Numpy 예제 중 일부에서 사용됩니다. 이 예에서 Pybind11을 통해 Eigen과 Numpy는 실제로 악수 모듈임을 알 수 있습니다. C ++/Python 인터페이스를 작성하는 데 거의 코드가 필요하지 않습니다. 대부분의 단순성은 통과되는 사본에 따라 다르며, 참조로 순전히 전달하려면 약간의주의가 필요합니다.
고유는 헤더 전용이기 때문에 설치가 필요하지 않습니다. 하나는 파일을 다운로드하고 컴파일 시간에 헤더를 포함하면됩니다.
일반적으로 다음과 같이 Eigen을 다운로드하여 설치할 수 있습니다.
mkdir /path/to/temp/build
cmake /path/to/eigen/download
make installMacOS의 경우 단순히 사용할 수 있습니다
brew install eigen
그 후에는 컴파일합니다
clang++ -I/path/to/eigen/instalation ...적절하게 구성된 경우 (일반적으로 경우) PKG-Config를 사용하여 경로를 추적 할 수 있습니다.
clang++ ` pkg-config --cflags eigen3 ` ...또는 cmake를 사용할 수 있습니다 (아래 참조).
간단한 도서관이 있다면 모든 것을 직접하고 싶을 수도 있습니다. 이 경우 C ++ 소스를 Python에 연결된 공유 객체로 컴파일합니다. 이것은 귀결됩니다
c++ -O3 -shared -std=gnu++11 -I ./pybind11/include ` python3-config --cflags --ldflags --libs ` example.cpp -o example.so -fPIC CMAKE를 사용하여 PYBIND11 애플리케이션을 매우 쉽게 컴파일 할 수 있습니다. 단순화를 위해 pybind11은 아래 예제의 하위 폴더로 포함됩니다 (실제로 많은 사본 이상에 대한 상징적 링크를 사용하여 CMakeLists.txt 를 사용할 수 있습니다.
cmake_minimum_required ( VERSION 2.8.12)
project (example)
add_subdirectory (pybind11)
pybind11_add_module(example example.cpp) (이 예제 모듈은 단일 소스 파일 example.cpp 로 구성됩니다). 컴파일하려면 사용하십시오.
cd /path/to/build
cmake /path/to/example/src
make 고유가 '설치'되면 CMakeLists.txt 에 다음을 추가하여 쉽게 포함시킬 수 있습니다.
find_package ( PkgConfig )
pkg_check_modules( EIGEN3 REQUIRED eigen3 )
include_directories ( ${EIGEN3_INCLUDE_DIRS} ) C ++ 14 표준은 CMakeLists.txt 에 다음을 포함시켜 사용할 수 있습니다.
set (CMAKE_CXX_STANDARD 14) 파일 setup.py 라이브러리에 추가 할 수 있습니다. 그런 다음 사용하여 컴파일하고 설치할 수 있습니다
python3 setup.py build
python3 setup.py install setup.py 어렵지 않지만 여기서는 다루지 않습니다. CPPMAT에 포함 된 일부 도구를 사용할 수 있으며 PIP (EG pip3 install cppmat )와 함께 설치할 수 있습니다. 또한 goosetensor 또는 다른 여러 저장소의 setup.py 볼 수 있습니다.
이 예제에는 목록을 가져 오는 (읽기 전용)를 modify 모든 항목에 2 개의 항목을 곱한 다음이를 복식 목록으로 반환합니다 ( example.cpp 참조). 파이썬 에서이 함수는 간단한 모듈 example 에 포함됩니다 ( test.py 참조).
이 예제의 목적은 함수가 목록을 수락하는 방법,이를 표준 C ++ std::vector 로 변환하는 방법 및 새 std::vector (또는 목록)를 반환하는 방법을 보여주는 것입니다. 실제 작업은 그다지 중요하지 않으며 설명 된 인터페이스입니다.
컴파일하려면 cmake를 사용하여 컴파일 지침을 CMakeLists.txt 에서 읽습니다.
cmake .
make또는 다음을 사용하여 직접 컴파일합니다.
c++ -O3 -shared -std=gnu++11 -I ./pybind11/include ` python3-config --cflags --ldflags --libs ` example.cpp -o example.so -fPIC예제를 실행합니다.
python3 test.pyPython 2로 실행하려면 위의 "Python3"의 두 가지 발생을 "Python"으로 바꾸십시오. CMAKE 지침을 수정하려면 온라인에서 자세한 내용을 찾으십시오.
이전 예제와 동일하지만 중첩 된 목록이 있습니다.
함수는 항목을 1 차원 배열에서 정수로 변환하는 것을 modify 다음 이러한 항목에 10을 곱합니다.
이 예제의 목적은 함수가 1 차원 Numpy 배열을 수락하는 방법, 표준 C ++ std::vector 로 변환하는 방법 및 1 차원 Numpy 어레이를 반환하는 방법을 보여주는 것입니다. PYBIND11을 사용하여 생성 된 인터페이스는 매우 유연하여 파이썬쪽에 목록 입력을 허용합니다.
하나의 기능 length . 이 함수는 행으로 2D 위치 벡터 목록을 포함하는 '매트릭스'를 수용합니다. 결과는 다시 각 행마다 "x"및 "y"위치와 2 차원 위치 벡터의 길이와 함께 '매트릭스'입니다.
Eigen 라이브러리를 사용하는 두 가지 기능 det and inv .
이 예의 목적은 C ++/Eigen과 Python/Numpy 사이의 상호 작용이 얼마나 사소한지를 보여주는 것입니다.
Cmake를 사용하고 실행하려면 위의 지침을 따르려면 (Eigen 헤더가 CMakeLists.txt .에 포함됩니다. 직접 컴파일하려면 Eigen 헤더가 포함되어야합니다.
c++ -O3 -shared -std=gnu++11 -I /path/to/eigen -I ./pybind11/include ` python3-config --cflags --ldflags --libs ` example.cpp -o example.so -fPIC예를 들어 Homebrew가있는 MacOS :
c++ -O3 -shared -std=gnu++11 -I /usr/local/Cellar/eigen/3.3.1/include/eigen3 -I ./pybind11/include ` python3-config --cflags --ldflags --libs ` example.cpp -o example.so -fPIC 하나의 함수 mul 있는 사용자 정의 CustomVectorXd 클래스. 이 수업은 고유 라이브러리를 사용합니다. 또한 기본 인수도 포함되어 있습니다.
또한이 예제에는 함수 trans 있습니다 (Custom CustomVectorXd 클래스와 완전히 관련이 없습니다). 새로운 Eigen::VectorXi (또는 numpy-array).
하나의 과부하 된 기능 mul . 이 기능은 int 인수 또는 double 인수로 호출되는 경우 '다르게'작동합니다. Pybind11의 기본 동작은 매우 강력합니다. 하나의 int 와 하나 double 인수로 함수를 호출 할 때 모듈은 mul 의 double 버전을 선택합니다 ( int 인수를 double 으로 시전합니다).
컴파일하려면 C ++ 14 표준이 컴파일러 인수로 -std=c++14 포함하여 사용되는지 확인하십시오.
이전 예와 유사하지만 고유 논쟁 (즉, 파이썬 쪽의 멍청한 주장).
컴파일하려면 C ++ 14 표준이 사용되어 있는지 확인하십시오.
이 예제에는 C ++의 사용자 정의 행렬 클래스 ( matrix.h )가 포함됩니다. 이 클래스는 간단한 인터페이스 ( pybind_matrix.h )를 사용하여 비피 어레이에 연결됩니다. 결과적으로 함수 ( example.cpp )에는 특수 래퍼 코드가 필요하지 않습니다.
스택 오버플로에 대한이 논의도 참조하십시오.
이 예제는 C ++의 열거 자와 인터페이스하는 방법을 특징으로합니다. 원칙적으로 인터페이스는 간단하지만 '트릭'을 보증합니다. 여기서 서브 모듈은 C ++와 같은 방식으로 열거 자와 상호 작용할 수있는 데 사용됩니다.
이 예제에는 하나 이상의 클래스가 특정 부모 또는 템플릿에서 파생되는 고전적인 예가 포함되어 있습니다. 이 특별한 예에는 일반적인 Animal 계급에서 파생 된 두 마리의 동물, Dog Cat 포함되어 있습니다. 일반 Animal 과 파생 된 클래스를 수용하는 기능 talk 있습니다.
이 특정 사례는 문서에 설명 된 바와 같이 더 많은 관련 인터페이스가 필요합니다.
이 예제에는 '기본'및 '파생 된'클래스가있는 간단한 CRTP와 PYBIND11 API에 등록 할 수 있습니다.
때때로 py::overload_cast 예를 들어 리턴 유형을 추론 할 수없는 경우 기능을 해결할 수 없습니다. 이 경우 static_cast 기능에 대한 포인터를 사용하여 명시 적으로 설명 할 수 있습니다. 자세한 정보는 문서에서 찾을 수 있습니다.