7

C++ クラスにいくつかの関数があり、Python スクリプトを使用してそれらを呼び出せるようにしたいというシナリオがあります。関数があるとしましょう

void greet(_msg);
    std::cout >> _msg >> std::endl;

カスタムの Python 呼び出しを介して呼び出し、引数を渡すことができるようにしたいです。

saySomething("Hello")

.py ファイルとして、greet 関数を呼び出して、「Hello」を引数として渡します。

私はそれが徹底的に議論されてきた主題であることを知っており、Python を C++ に埋め込むことについて研究を共有し、標準の Python/C API を使用して Python スクリプトから値を読み取り、Python で関数を実行することができました。 C ++から引数を渡しますが、この特定の結果を達成する方法を理解できないようです。

ctypes と、boost:python や swig などのさまざまな wrappin ライブラリを見てきましたが、それらがどの程度私が望むものを達成するのに役立つかを理解できないようです。

4

3 に答える 3

5

関心のある Python のバージョン (2.x または 3.x) に応じて、Python インタープリターの拡張と埋め込みの章を2.xまたは3.xについて読んでください。Python の拡張のみに関心があるので、セクション1. C または C++ による Python の拡張では、Python スクリプトから C++ で実装された関数を呼び出すために必要なものを実装する方法について完全な説明が提供されます。

確かに、Python 用の C/C++ API をラップできるライブラリとジェネレーターは多数あります ( Boost.PythonSWIGなど)。 C API。これらのツールを使用する場合でも、とにかく Python C API に取り掛かるか、少なくとも理解する必要があることがよくあります。

于 2012-11-21T17:55:18.390 に答える
4

私は最近、まさにこれをする必要がありました。Boost.Python は私たちが求めていること (およびそれ以上) を実行しますが、個人的には (Boost が大好きなのと同じくらい)、1 つの機能を取得するために Boost ライブラリの半分をドラッグする必要があるのは少しやり過ぎだと思います。クラス構造が変更される間、コード生成は常に維持するのが苦痛になるため、SWIGも実際には選択肢ではありませんでした(誤解しないでください。これらは素晴らしいソリューションです!、私が探していたものではありません)。

したがって、私に残された唯一のことは、最初の原則 (Python/C API) から実装することでした。そこで「ECS:Python」が誕生しました。ECS:Python (Embedded C++ Scripting with Python) は、C++ 開発者向けに特別に設計した単純な C++ Python ラッパー ライブラリです。C++ アプリケーションから組み込みの Python インタープリターにオブジェクトを公開してインタラクティブなスクリプトを作成できます。非常に軽量で使いやすいです。

その無料 (BSD) とオープン ソース。ここに興味がある場合は、 http ://sourceforge.net/projects/ecspython です。

于 2012-11-27T19:17:25.017 に答える
3

scipy パッケージの一部である weave.inline() 関数を使用して、C/C++ ファイルをコンパイルおよび実行し、Python スクリプト内から出力を取得できます。

于 2012-11-21T17:44:01.000 に答える