私はかなり大きなC++ライブラリを持っており、それをサポートするいくつかのサブライブラリがあり、すべてをPython拡張機能に変換する必要があります。クロスプラットフォームである必要があるため、distutilsを使用していますが、より優れたツールがあれば、提案を受け付けています。
distutilsに最初にサブライブラリをコンパイルさせ、メインライブラリから拡張機能を作成するときにそれらをリンクさせる方法はありますか?
私は、製品の大規模なC++ライブラリを使用してこれを実行します。バインディングを作成するタスクを自動化するのに役立つツールがいくつかあります。最も人気のあるツールはSWIGです。これは、しばらく前から使用されており、多くのプロジェクトで使用されており、一般的に非常にうまく機能します。
SWIGに対する最大のことは(私の意見では)、SWIG自体のC++コードベースはそれを穏やかに言うと本当にかなり無愛想であるということです。それはSTLの前に書かれ、今では古くて不気味な独自のセミダイナミック型システムを持っています。立ち往生してコアにいくつかの変更を加える必要がない限り、これはそれほど重要ではありません(私はかつてdoxygen-> docstring変換を追加しようとしました)が、もしそうなら、幸運を祈ります!また、SWIGで生成されたコードはそれほど効率的ではないと言われていますが、これは本当かもしれませんが、私にとっては、SWIGが自分自身をボトルネックとして心配するのに十分だとは思っていません。
SWIGがボートをフロートさせない場合に使用できるツールは他にもあります。boost.pythonも人気があり、C++コードですでにboostライブラリを使用している場合に適したオプションになる可能性があります。欠点は、ほとんどすべてのc ++テンプレートベースであるため、コンパイル時間が重いことです。
これらのツールはどちらも、公開される内容とその実行方法を定義するために、事前にいくつかの作業を行う必要があります。SWIGの場合、C ++ヘッダーに似ているが削除されたインターフェイスファイルを提供し、SWIGに複雑な型の変換方法などを指示するいくつかの追加のディレクティブを提供します。これらのインターフェイスの記述は面倒な場合があるため、pygccxmlのようなものを参考にしてください。それらを自動生成します。
そのパッケージの作者は、実際にあなたが好きかもしれない別の拡張機能を書いています:py++。このパッケージは2つのことを行います。バインディング定義を自動生成し、それをboost.pythonにフィードして、Pythonバインディングを生成できます。基本的に、ほとんどの人にとって完全なソリューションです。特に特別な要件や満たすのが難しい要件がない場合は、そこから始めたいと思うかもしれません。
参考として役立つかもしれない他のいくつかの質問:
Python用のバインディング生成ツールのこの比較も便利です。アレックスがコメントで指摘しているように、今ではかなり古いですが、少なくとも風景のいくつかのアイデアをあなたに与えます...
ビルドを駆動する方法に関しては、distutilsを使用するより高度なビルドツールを検討することをお勧めします。Pythonを使い続けたい場合は、フレームワークとしてWafを強くお勧めします(他の人はSConsが進むべき道だと言うでしょう、しかし、それは地獄のように遅いと私を信じてください:私はすでにそこに行って戻ってきました!)...それは少し学ぶ必要があります、しかしあなたが頭を動かすときそれは非常に強力です。また、純粋なPythonであるため、ビルドプロセスの一部として使用している他のPythonコードと完全に統合されます(たとえば、最後にPy ++を使用します)...