PythonとC++の統合
質問
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 のように、長いコンパイル時間と大きなライブラリにつながる可能性があるということです。まだベンチマークはしていません。
関連
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] 複数行の長い文字列を作成するためのPythonicな方法
-
[解決済み] 最近のPythonでカスタム例外を宣言する適切な方法?
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】C++の余分な資格エラー
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】Enterキーを押して続行する
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む