2009-07-02 15 views
5

誰でもPythonをC/C++で拡張するためのツールやソフトウェアについてのヒントを教えてください。ありがとう。C/C++でPythonを拡張する

+6

あなたがhttp://docs.python.org/c-api/を読んだとき、あなたはどんな問題を抱えていましたか? –

+0

これを行うにはCythonが良い選択です!私は実際にCythonのソースファイルを書くことから、ビルドするまでのすべての詳細をカバーした小さな記事を書いていました。setup.py - 基本的にCythonでC/C++ライブラリをラップするために必要なものすべてを書きました:http://martinsosic.com/ development/2016/02/08/wrapping-c-library-as-python-module.html – Martinsos

答えて

8

我々は、Pythonでの使用のために私たちのC/C++ライブラリをラップするためにSWIGを使用しています。それはかなりうまくいく。

http://www.swig.org/

13

PythonのWebサイト自体は素晴らしいset of examplesを持っているだけでなく、API documentation。それは文字通り私がC拡張を書く必要があるときに私が使用したものです。 C/C++コンパイラもhttp://www.python.org/doc/ext/

そしてもちろん:

+0

+1:これはすでによく文書化されています。 –

+0

ああ、私はあなたが比喩的に意味していると思った、明確化のためにありがとう – andrewrk

+0

libaryが(QTやWxWidgetsのような)非常に大きなものでないなら手書きのコードが最高です。 – Lothar

2

はい、あなたはこれを必要とします。

あなたが何をしようとすると、あなたは、私は人々があなたより多くの情報を与えることができると確信してい作っているエクステンションの種類を記述した場合。それはあなたが何をしたいかどう

は、ライブラリをラップするSWIGのようなものがあります。あなただけのスピードアップをしたい場合は、Cは、多くの場合、答えは、常にではない、など

13

私はC++もののためBoost.Pythonに必須の参照を追加します。

+0

私は数日前にboost.pythonを使い始めました。私はすでに起動しています。 –

3

多くの解決策があります。可能であれば、Cの拡張を書くのは面倒なので、一般的には避けてください。しばしば、サードパーティライブラリを使用する必要があります。その場合、今日の勝利の解決策はcythonだと私は思います。

Cythonは「パイソンのように見える」言語ですが、オプションのタイピングを使用してはるかに高速に行うことができます。内部で直接C関数を呼び出すことができ、参照カウント(C拡張の難しい問題)のほとんどは自動的に行われます。私の経験上、boost.python、swig、またはctypesよりもはるかに優れています:

  • boost.pythonはC++拡張機能のIMHOだけを意味します。私はそれがあまりにも複雑で、何かがうまくいかないときにデバッグするのが難しいと思っています
  • swigにはかなりのオーバーヘッドがあり、良いコードにつながることはありません。これは、機能のカップルのための[OK]を動作しますが、非自明な拡張子は、多くの場合、タイプマップを使用し、構文は、あなたがラップするPythonオブジェクト(リスト、辞書などを...)を使用することができますcythonで素早く

醜い取得し、あなたのCライブラリ。もちろん、スピードの理由から自分の拡張機能を書く必要がある場合にも、非常に便利です。科学的なpythonコミュニティでは、速度が必要なときにcythonが最適なツールになったと思います。

+0

OPが最初にやりたい理由を知らずに「可能ならば避けるべきだ」と言って、間違っています。 PythonがC拡張をサポートする理由はあります。それは、C拡張が最適な解決策であることがあることがあります。その場合、避けるべきではありません。また、ctypesはコンテキストに依存してcythonよりも多くの利点を持っていますが、そうでなければ、より良いと言うのが間違っています(http://stackoverflow.com/questions/1942298/wrapping-ac-library-in-python-c-cython- – mwag

6

私はC++コードをラップするための私の好きなソリューションの1つを指摘しています。SIP(これはSWIGのようにCをラップしても、ブーストとは違うが、 Riverbank Softwareが開発したPyQtは、素晴らしいQt C++クロスプラットフォームフレームワークのPythonインターフェイスです。あなたのC++コードがQt機能を使用するのは当然の選択です.Boost PythonがあなたのC++コードBoostを使用します。

SWIGは10年前に作られたときの合理的な決定であり、Java、Perl、Tclなどからの使用のためにCまたはC++コードをラップすることができるという理論上の利点があります。しかし、Pythonを気にしているだけなら、それを目立たせるために何かを見るのは難しいです。

Cythonのほかに、他の回答が指摘している(と私は推薦しますが、最近は非常に速く変化していますので、もっと安定したものが必要な場合は注意してください) 、標準機能モジュールを検討してくださいctypes - 私は非常に広範な作業( "oops"エラーはCまたはC++コンパイラがあなたにctypesでランタイムクラッシュを引き起こす可能性があるというエラー)を使用しませんが、それは標準のPythonディストリビューションに付属しているので非常に便利です!)

古き良きC APIはまだ死んでいません。今日、私の良い古いオープンソースプロジェクトgmpyのためにほとんどの実行を行っている偉大な人のCaseと今日会いました。一緒に私たちはC少なくともgmpyの次のリリースのためのAPI - Cythonを安定させるときにはCythonに切り替えることを検討しますが、スイッチはまだ時期尚早であることに同意しました。 (gmpyの主なポイントは、可能な限り高速になるためです) - )。

+0

PySideに相当するSibokenについてどう思いますか? http://www.pyside.org/docs/shiboken/ –

+0

@Craig、まだ試していないが、次にQtの仕事をする必要があるとき(私にPySideを試してみる現実的な機会を与える)を計画する。 –

+0

オススメについては申し訳ありませんが、私は "Shiboken"を意味しました。 PySideは有望ですね。私は彼らが車輪を再開発する必要があることを残念に思っています。 –

3

これまで私はpycxxを使用していましたが、本当にこのlibを使いたかったのです。

私の意見では、SWIGよりも使いやすいです。私は実際にboostを使用したことがないので、boost.pythonと比較することはできません。私はpycxxがboost.pythonより軽いと思うが、間違っているかもしれない。

pycxxの重要な点は、python c apiのC++ラッパーであることです。それはオブジェクト指向であり、すべての困難なメカニズムを隠します。 Pythonプログラマーにとっては非常に直感的です。それは非常に使いやすく、始めにいくつかの良い例があります。

私はpythonをPython拡張をC++で行うためのファーストクラスの市民としてお勧めします。

関連する問題