Pybind11的功能是通過Pybind11的Readme的以下引用來捕獲的:
PYBIND11是一個僅輕質標題庫,它在Python中揭示C ++類型,反之亦然,主要是為了創建現有C ++代碼的Python綁定。它的目標和語法類似於David Abrahams的出色Boost.python圖書館...
BOOST.PYTHON的主要問題 - 創建這樣類似項目的原因是Boost。 Boost是一套非常大的實用程序庫,幾乎與存在的每個C ++編譯器一起使用。 ...現在C ++ 11兼容編譯器已廣泛使用,這種重型機械已成為過度且不必要的依賴性。
該存儲庫包含使用Pybind11的幾個示例。即使PYBIND11開發人員提供的在線文檔使其使用相對簡單,但在此提供了幾個示例,例如這裡提供的示例 - 使Pybind11更易於使用。這些示例是為了讓您使用pybind11更快地開始。但是,它們絕不是詳盡的,並不總是提供最佳選擇。因此,強烈建議您自己思考。此外,非常歡迎使用類似的簡單示例(或通過進一步改善現有示例)的貢獻。請在Github上提出拉請請求或問題,或與我聯繫。
在應得的信用額的地方給予信用:
Pybind11的創建者做得很好!它真的很容易使用,而且非常輕巧。同樣,文檔已經非常完整。
杜克大學的Cliburn Chan和Janice McCarthy提供的例子有很大的幫助。請閱讀他們的文檔。
請注意,在PYBIND11存儲庫中,還有一些測試案例將其兼作為示例,但是當您不熟悉Pybind11時,這些案例並不是很有見地。
最後,pybind11被積極使用。因此,人們可以在積極維護的特定解決方案中查看。例如:
PYBIND11模塊(僅是標頭!)作為此存儲庫的子模塊。克隆該項目時需要注意。有兩個選擇:
最簡單的選項是:
git clone --recursive https://github.com/tdegeus/pybind11_examples.git這將下載該項目中使用的版本。要更新子模塊本身的最新提交:
git submodule update --remote也可以直接從源頭下載subsodule:
git clone https://github.com/tdegeus/pybind11_examples.git
cd pybind11_examples
git submodule init
git submodule update特徵庫用於一些Numpy示例。從這些示例中可以看出,通過Pybind11,特徵和Numpy確實是握手模塊。創建C ++/Python接口幾乎不需要代碼。請注意,大多數簡單性取決於所傳遞的副本,如果一個人想純粹通過參考文獻傳遞,就需要一些注意。
EIGEN不需要安裝,因為它也僅是標題。一個人只需要下載文件並在編譯時包含標題即可。
通常,可以通過以下方式下載和安裝特徵:
mkdir /path/to/temp/build
cmake /path/to/eigen/download
make install對於Macos,一個人可以簡單地使用
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當“安裝” eigen 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一起安裝(例如pip3 install cppmat )。此外,可以查看goosetensor或我的其他幾個存儲庫的setup.py 。
此示例具有一個函數modify該函數獲取列表(僅讀取),將所有條目乘以兩個,然後將其返回為雙打列表(請參見example.cpp )。從python中,此函數包含在一個簡單的模塊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.py要使用Python 2運行,只需用“ Python”替換上面的“ Python3”的兩個出現。要修改CMAKE指令在線查找更多。
與上一個示例相同,但帶有嵌套列表。
一個函數modify將條目從一維數組轉換為整數,然後將這些條目乘以10。
此示例的目的是展示如何使函數接受一維的numpy陣列,如何將其轉換為標準的C ++ std::vector以及如何返回一維的Numpy陣列。請注意,使用PYBIND11生成的接口非常靈活,甚至接受Python側的列表輸入。
一個功能length 。此函數接受一個“矩陣”,其中包含二維位置向量的列表作為行。結果再次是一個“矩陣”,每行的“ x”和“ y”位置以及2-D位置向量的長度。
使用特徵庫的兩個函數det and inv 。
此示例的目的是說明C ++/Eigen和Python/Numpy之間的相互作用是如何微不足道的。
要使用cmake進行編譯並運行,請按照上述說明進行編譯(其中包含在CMakeLists.txt中的特徵標頭。
c++ -O3 -shared -std=gnu++11 -I /path/to/eigen -I ./pybind11/include ` python3-config --cflags --ldflags --libs ` example.cpp -o example.so -fPIC例如,在MacOS上與自製的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 (完全與自定義CustomVectorXd類無關)。目的是展示如何返回新的Eigen::VectorXi (或numpy-array)。
一個超載功能mul 。如果將其稱為int參數或double參數,則此功能將“不同”。請注意,pybind11的默認行為非常強大。當用一個int和一個double參數調用該函數時,該模塊將選擇mul的double版本(並將int參數投入double )。
要編譯,請確保使用C ++ 14標準,例如以-std=c++14作為編譯器參數。
類似於上一個示例,但具有特徵參數(即來自Python側的numpy參數)。
要編譯,請確保使用C ++ 14標準。
此示例包括C ++中的自定義矩陣類(在matrix.h中)。使用簡單的接口(在pybind_matrix.h中)將此類耦合到numpy-array。因此,功能(例如example.cpp )不需要任何特殊的包裝代碼。
另請參閱有關堆棧溢出的討論。
此示例具有與C ++中的枚舉器接口的一種方法。原則上,界面很簡單,但值得一個“技巧”。在這裡,subsodule可以用與C ++中的相同方式與枚舉者進行交互。
此示例包含一個經典示例,其中一個或多個類是從某個父母或模板派生的。這個特定的例子包含兩隻動物,一隻Dog和一隻Cat ,它們都來自通用Animal類。有一個功能talk ,可以接受通用Animal ,因此可以接受任何派生的階級。
如文檔中所述,這種特殊情況需要更多涉及的接口。
該示例具有一個簡單的CRTP,其中具有“基礎”和“派生”類,以及對PYBIND11 API的註冊。
有時py::overload_cast無法解決您的功能,例如當無法推斷返回類型時。在這種情況下,您可以通過static_cast向您的功能指示進行明確說明,可以在文檔中找到更多信息。