web-dev-qa-db-ja.com

統合Python And C ++

C++は非常に柔軟な言語であるため、私はC++を学んでいます。しかし、Twitter、Facebook、Deliciousなどのインターネット関連のものについては、Pythonがはるかに優れたソリューションのようです。

同じプロジェクトにC++とPythonを統合できますか?

57
Nathan Campos

PythonとC/C++とのインターフェースは簡単な作業ではありません。

ここで、python拡張機能を記述するためのさまざまなメソッドの前の質問に対する 前の回答 をコピー/貼り付けます。 Boost.Python、SWIG、Pybindgenを搭載...

  • Python C-API を使用して、CまたはC++で自分で拡張機能を記述できます。

    一言で言えば、それを行う方法を学ぶことを除いてそれをしないでください。正しく行うのは非常に困難です。参照を手動でインクリメントおよびデクリメントし、1つの関数を公開するためだけに多くのコードを記述する必要がありますが、メリットはほとんどありません。

  • Swig

    pro:多くのスクリプト言語のバインディングを生成できます。

    短所:パーサーの動作が好きではありません。彼らが何らかの進歩を遂げたかどうかはわかりませんが、2年前にはC++パーサーはかなり制限されていました。ほとんどの場合、.hヘッダーをコピー/貼り付けして%文字を追加し、swigパーサーに追加のヒントを与える必要がありました。

    また、複雑ではない型変換のために、Python C-APIを時々処理する必要がありました。

    もう使用していません。

  • Boost.Python

    pro:非常に完全なライブラリです。これにより、C-APIで可能なすべてのことをC++で行うことができます。このライブラリを使用してC-APIコードを記述する必要はありませんでした。また、ライブラリが原因でバグに遭遇したこともありません。バインディングのコードは、チャームのように機能するか、コンパイルを拒否します。

    バインドするC++ライブラリが既にある場合は、おそらく現在利用可能な最良のソリューションの1つです。しかし、書き換える小さなC関数しかない場合は、おそらくCythonで試してみます。

    短所:事前にコンパイルされたBoost.Pythonライブラリがない場合は、Bjamを使用します(makeの一種の置き換え)。私は本当にBjamとその構文が嫌いです。

    B.Pで作成されたPythonライブラリは肥満になる傾向があります。また、コンパイルにはlot時間がかかります。

  • Py ++ :Boost.Pythonが簡単になりました。 Py ++はC++パーサーを使用してコードを読み取り、Boost.Pythonコードを自動的に生成します。また、著者からの素晴らしいサポートもあります(私ではありません;-))。

    短所:Boost.Python自体に起因する問題のみ。

    Editこのプロジェクトは中止されました。おそらくまだ動作中ですが、切り替えを検討する方が良い場合があります。

  • Pybindgen

    C-APIを処理するコードを生成します。 Pythonファイルで関数とクラスを記述するか、Pybindgenにヘッダーを読み取らせてバインディングを自動的に生成できます(このため、Py ++の作成者が作成したpythonライブラリpygccxmlを使用します)。

    短所:それは若いプロジェクトであり、Boost.Pythonよりも小さなチームです。まだいくつかの制限があります:独自のC++例外を公開することはできません。C++クラスに多重継承を使用することはできません。

    とにかく試してみる価値はあります!

  • Pyrexおよび Cython

    ここでは、実際のC/C++ではなく、PythonとCを組み合わせて作成します。この中間コードは、通常のPythonモジュールを生成します。

2013年7月22日編集:Py ++は廃止されたように見えますが、今は良い代替品を探しています。現在、C++ライブラリについてCythonを試しています。この言語は、PythonとCの混合です。Cython関数内では、PythonまたはC/C++エンティティ(関数、変数、オブジェクトなど)を使用できます。

Cythonは非常に簡単に習得でき、非常に優れたパフォーマンスを発揮します。また、レガシーC++ライブラリをインターフェイスする必要がない場合は、C/C++を完全に回避することもできます。

ただし、C++にはいくつかの問題があります。 Py ++に比べて「自動」ではないため、おそらく安定したC++ APIに向いています(今では私のライブラリの場合です)。 Cythonで見た最大の問題は、C++ポリモーフィズムです。 Py ++/boost:pythonを使用すると、C++で仮想メソッドを定義し、Pythonでオーバーライドして、C++内でPythonバージョンを呼び出すことができました。 Cythonでも実行可能ですが、C-Python APIを明示的に使用する必要があります。

2017-10-06の編集:

Boost.Pythonに似ていますが、いくつかの潜在的な利点がある、新しいもの pybind11 があります。たとえば、C++ 11言語機能を使用して、新しいバインディングを簡単に作成できます。また、ヘッダーのみのライブラリなので、使用する前にコンパイルするものはなく、リンクするライブラリもありません。

私はそれを少し遊んでみましたが、実際には非常にシンプルで使いやすいものでした。私の唯一の恐怖は、Boot.Pythonのように、コンパイル時間が長くなり、ライブラリが大きくなる可能性があることです。まだベンチマークを行っていません。

90
ascobol

はい、可能ですし、推奨されます 文書化された 。私はそれを自分でやったが、非常に簡単であることがわかった。

9

製品では swig を非常にうまく使用しています。

基本的に、swigはC++コードを受け取り、その周りにpythonラッパーを生成します。

3
Alan

PyTorchがどのように統合を行っているかを調べることをお勧めします。

3

Python/C APIリファレンスマニュアル -拡張モジュールを記述したりPythonを埋め込みたいCおよびC++プログラマが使用するAPI。

Python Interpreter の拡張と埋め込み

Pythonインタープリターを新しいモジュールで拡張するためにCまたはC++でモジュールを記述する方法について説明します。これらのモジュールは、新しい関数だけでなく、新しいオブジェクト型とそのメソッドも定義できます。 Python拡張言語として使用する別のアプリケーションのインタープリター。最後に、拡張モジュールをコンパイルおよびリンクして、実行時にインタープリターに動的にロードできるようにする方法を示します。基盤となるオペレーティングシステムがこの機能をサポートしています。

3
gimel

Pyrex を試してください。 PythonのC++拡張機能を簡単に記述できます。

3
Brian

こちらをご覧ください:

CまたはC++でPythonを拡張

「Cでプログラミングする方法を知っていれば、Pythonに新しい組み込みモジュールを追加するのは非常に簡単です。このような拡張モジュールは、Pythonで直接実行できない2つのことを実行できます。 、Cライブラリ関数とシステムコールを呼び出すことができます。

拡張機能をサポートするために、Python API(Application Programmers Interface)は、Python run- Python APIは、ヘッダー「Python.h」をインクルードすることにより、Cソースファイルに組み込まれます。」

http://www.python.org/doc/2.5.2/ext/intro.html

PSそれは「統合」と綴られています:)

2
Larry Watanabe

過去にPyCxx http://cxx.sourceforge.net/ を使用しましたが、非常に優れていることがわかりました。

python c APIを非常にエレガントな方法でラップし、非常に使いやすくします。c++でpython拡張機能を記述します。明確な例が提供されているため、簡単に開始できます。

私はこのライブラリの使用を本当に楽しんでおり、お勧めします。

2
luc

別の興味深い方法は、python自体を実行してc ++ヘッダーファイルを解析するpythonコード生成です。 OpenCVチームはこのアプローチを成功させました 。そして、彼らはOpenCVライブラリのJavaラッパーを作成するためにまったく同じことをしました。特定のライブラリに起因する制限なしに、これがクリーナーPython AP​​Iを作成したことがわかりました。

1
Tae-Sung Shin

C++で Python拡張機能 と書くことができます。基本的にPython自体はCで書かれており、これを使用してCコードを呼び出すことができます。Pythonオブジェクト。 Boost.Python

1
Matt Price