pybind11の力は、pybind11のreadmeからの次の引用によって捉えられています。
Pybind11は、主に既存のC ++コードのPythonバインディングを作成するために、PythonでC ++タイプとその逆を公開する軽量ヘッダーのみのライブラリです。その目標と構文は、David Abrahamsによる優れたBoost.pythonライブラリに似ています...
boost.pythonの主な問題と、このような類似のプロジェクトを作成する理由はブーストです。 Boostは、存在するほぼすべてのC ++コンパイラで動作する非常に大きく複雑なユーティリティライブラリスイートです。 ... C ++ 11互換性のあるコンパイラが広く利用可能であるため、この重い機械は非常に大きくて不必要な依存関係になりました。
このリポジトリには、pybind11の使用に関するいくつかの例が含まれています。 Pybind11の開発者が提供するオンラインドキュメントでは、それを比較的簡単に使用していますが、ここで提供されるようないくつかの例は、Pybind11をさらに使いやすくします。これらの例は、Pybind11から早く開始することを目的としています。しかし、それらは決して網羅的ではなく、常に最適な選択を提供するとは限りません。したがって、自分で考えることは非常に推奨されます。さらに、同様の簡単な例との貢献(または既存の例をさらに改善することによって)は大歓迎です。 githubにプルリクエストまたは問題を提出するか、私に連絡してください。
クレジットが期限になる場所でクレジットを与えるには:
Pybind11の作成者は素晴らしい仕事をしました!使いやすく、非常に軽量です。また、ドキュメントはすでに完全に完全です。
デューク大学のCliburn ChanとJanice McCarthyが利用できる例は、非常に役立ちました。彼らのドキュメントも読んでください。
Pybind11リポジトリの例として倍増するテストケースもあることに注意してくださいが、Pybind11を初めて使用する場合、これらはあまり洞察力がありません。
最後に、Pybind11が積極的に使用されます。したがって、特定のソリューションのために、積極的に維持されているライブラリを見ることができます。例えば:
Pybind11モジュール(ヘッダーのみです!)は、このリポジトリのサブモジュールとして含まれています。これには、このプロジェクトをクローン化する際にある程度の注意が必要です。 2つのオプションがあります。
最も簡単なオプションは次のとおりです。
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を使用できます(以下を参照)。
簡単なライブラリがある場合は、すべてを自分でやりたいと思うかもしれません。この場合、Pythonにリンクされた共有オブジェクトにC ++ソースをコンパイルします。これは沸きません
c++ -O3 -shared -std=gnu++11 -I ./pybind11/include ` python3-config --cflags --ldflags --libs ` example.cpp -o example.so -fPICPybind11アプリケーションは、Cmakeを使用して非常に簡単にコンパイルできます。簡単にするために、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
makeeigenが「インストール」されると、 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を書くのは難しくありませんが、ここではカバーされていません。 PIP( pip3 install cppmatなど)でインストールできるCPPMATに含まれるいくつかのツールを使用できます。さらに、GooseTensorまたは他のいくつかの私のリポジトリのsetup.pyを見ることができます。
この例には、リスト(読み取り専用)を取得し、すべてのエントリに2つを掛け、ダブルのリストとして返す1つの関数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.pyPython 2で実行するには、上記の「Python3」の2つの発生を「Python」に置き換えるだけです。 cmakeの指示を変更するには、オンラインで詳細を確認してください。
前の例と同じですが、ネストされたリストがあります。
関数は、エントリを1次元配列から整数に変換modify 、これらのエントリに10を掛けるように変更します。
この例の目的は、関数に1次元のnumpyアレイを受け入れる方法、これを標準のC ++ std::vectorに変換する方法、および1次元numpyアレイを返す方法を示すことです。 Pybind11を使用して生成されたインターフェイスは非常に柔軟であるため、Python側のリスト入力も受け入れていることに注意してください。
1つの関数length 。この関数は、行として2D位置ベクターのリストを含む「マトリックス」を受け入れます。結果は、各行の「x」と「y」位置、および2-d位置ベクトルの長さを伴う「マトリックス」です。
Eigen Libraryを使用する2つの機能detおよびinv 。
この例の目的は、C ++/eigenとPython/numpyの間の相互作用がどれほど簡単であるかを示すことです。
cmakeを使用してコンパイルして実行するには、上記の指示に従ってください( 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 1つの関数mulを持つカスタムCustomVectorXdクラス。このクラスでは、固有ライブラリを使用しています。また、デフォルトの引数も含まれています。
さらに、この例には関数transがあります(カスタムカスタムCustomVectorXdクラスとはまったく関係ありません)。それは、新しいEigen::VectorXi (またはnumpy-array)です。
1つの過負荷機能mul 。この関数は、 int引数またはdouble引数で呼び出される場合、「異なって機能します」。 Pybind11のデフォルトの動作は非常に堅牢であることに注意してください。 1つのintと1つのdouble引数で関数を呼び出すと、モジュールはmulのdoubleバージョンを選択します(そして、 int引数がdoubleにキャストされます)。
コンパイルするには、 -std=c++14コンパイラ引数として含めることにより、C ++ 14標準が使用されていることを確認してください。
前の例と同様ですが、Eigen引数(つまり、Python側からのNumpy引数)があります。
コンパイルするには、C ++ 14標準が使用されていることを確認してください。
この例には、C ++( matrix.h )のカスタムマトリックスクラスが含まれています。このクラスは、単純なインターフェイス( pybind_matrix.h )を使用して、numpy-arrayに結合されています。したがって、関数( example.cpp )には、特別なラッパーコードが必要ありません。
スタックオーバーフローのこの議論も参照してください。
この例は、C ++の列挙者とインターフェイスする方法を特徴としています。原則として、インターフェイスは簡単ですが、「トリック」が必要です。ここでは、サブモジュールを使用して、C ++と同じ方法で列挙者と対話できるようにします。
この例には、1つ以上のクラスが特定の親またはテンプレートから派生する古典的な例が含まれています。この特定の例には、両方とも一般的なAnimalクラスに由来する2つの動物、 DogとCatが含まれています。一般的なAnimal 、したがって派生したクラスを受け入れる関数のtalkがあります。
この特定のケースには、ドキュメントで説明されているように、より複雑なインターフェイスが必要です。
この例は、「ベース」と「派生」クラスを備えた単純なCRTPと、 Pybind11 APIへの登録を備えています。
py::overload_cast 、たとえば、返品タイプを推測できない場合など、関数を解決できない場合があります。その場合、あなたはあなたの関数へのポインターをstatic_castで明示的にすることができます。より多くの情報がドキュメントにあります。