1. ホーム
  2. c++

PythonとC++の統合

2023-10-07 20:21:04

質問

C++はとても柔軟な言語なので、勉強しています。しかし、Twitter、Facebook、Deliciousなどのようなインターネット上のものについては、Pythonの方がはるかに良いソリューションのように思われます。

同じプロジェクトでC++とPythonを統合することは可能なのでしょうか?

どのように解決するのですか?

PythonとC/C++を連動させるのは簡単なことではありません。

ここで、私はコピー/ペーストで 前の答え pythonの拡張機能を記述するためのさまざまな方法に関する以前の質問について。Boost.Python、SWIG、Pybindgen...をフィーチャーしています。

  • CやC++で自分で拡張機能を書くには Python C-API .

    一言で言うと、やり方を覚える以外はやめておいた方がいいです。正しく行うのは非常に困難です。手作業で参照をインクリメント、デクリメントしなければならず、1つの関数を公開するためだけに多くのコードを書かなければならず、メリットはほとんどありません。

  • スウィッグ :

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

    cons: パーサが動作する方法が好きではありません。進歩したのかどうかは分かりませんが、2 年前の C++ パーサーはかなり限定的でした。ほとんどの場合、私は自分の .h ヘッダーをコピー/ペーストして、いくつかの % 文字を追加し、swig パーサーに余分なヒントを与えるために、.h ヘッダーをコピー/貼り付ける必要がありました。

    また、(それほど複雑ではない)型変換のために、時々PythonのC-APIを扱う必要がありました。

    もう使ってません。

  • ブースト.パイソン :

    プロです。 非常に完成度の高いライブラリです。C-APIで可能なことのほとんどすべてを、C++で行うことができます。私はこのライブラリでC-APIのコードを書く必要はありませんでした。また、このライブラリに起因するバグに遭遇したこともありません。バインディングのコードは、魅力的に動作するか、コンパイルを拒否するかのどちらかです。

    おそらく、バインドするための何らかの C++ ライブラリを持っているのであれば、現在利用可能な最良のソリューションのひとつでしょう。しかし、書き換える小さな C 関数があるだけなら、私はおそらく Cython で試してみるでしょう。

    短所:プリコンパイルされたBoost.Pythonライブラリを持っていない場合、Bjam(makeの代わりのようなもの)を使うことになります。私は、Bjamとその構文が本当に嫌いです。

    B.Pで作成したPythonライブラリは肥満になりがちです。また ロット の時間がかかる。

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

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

    Edit このプロジェクトは廃止されたようです。おそらくまだ使えると思いますが、乗り換えを検討したほうがいいかもしれません。

  • ピビンゲン :

    C-APIを扱うコードを生成します。Pythonファイルに関数やクラスを記述するか、Pybindgenにヘッダを読ませてバインディングを自動生成させます(これにはPy++の作者が書いたpygccxmlというPythonライブラリが使用されます)。

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

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

  • パイレックスと サイソン :

    ここでは、本当のC/C++ではなく、PythonとCを混ぜたものを書きます。この中間コードによって、通常のPythonモジュールが生成されます。

2013年7月22日を編集しました。 今、Py++は廃止されたように見えるので、私は今、良い代替品を探しています。私は現在、C++ライブラリのためにCythonを実験しています。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を編集しました。

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

少し遊んでみましたが、確かに非常にシンプルで快適に使用できました。私の唯一の懸念は、Boot.Python のように、長いコンパイル時間と大きなライブラリにつながる可能性があるということです。まだベンチマークはしていません。