7

ユーザーがアプリケーション環境内で Python スクリプトを実行できるようにしたり、内部 (C++ で実装された) オブジェクトにアクセスしたりできるようにするために、アプリケーションに Python を埋め込む実験に興味があります。私がやっている。

Embedding Python in Another Applicationを読みましたが、これはクラスやオブジェクトではなく、C API とフラット C 関数についてのみ話しているようで (何かを見逃していない限り)、その「Embedding Python in C++」セクションは 2 文しかありません。 . ただし、boost::python の使用方法にも出くわしましたが、これは優れているようです。

問題が 1 つあります。boost::pythonは C++ Builder 2010 でサポートされていません

したがって、これを考えると、C++ Builder 2010 でコンパイルされた C++ アプリケーションに Python を埋め込むための最良のアプローチは何であり、どの手法が最適かを使用して、どのようにクラスとオブジェクトを公開/統合して、Python コーダーがオブジェクトにアクセスできるようにしますか?プログラムの内部指向? 標準的なアプローチを見逃していませんか? 内部クラスまたはインスタンス化されたオブジェクトをオブジェクトとして Python に公開するのは簡単ですか、それとも API は真に C スタイルまたはフラット / 非 OO ですか。

注: 私は実際に、C++ Builder と Delphi の両方を含む RAD Studio を使用しています。ある種の Delphi 固有のバインディングを利用することは可能かもしれませんが、私が遭遇したものは6 ~ 7 年前のもの、または新しいもの (Python 2.6)ですが、ドキュメントがないようで「とにかくこれらの [sic] コメントを読んだ人はいますか? このプロジェクトに取り組んでいる人はいますか?これは励みにはなりません。ただし、特に組み合わせた D + CB アプリで動作する可能性が高いと思われる場合は、Delphi 固有の回答を自由に含めてください。完璧でなくても、すべての回答に感謝します。調査はできます。どこへ行くべきかについての指針が必要なだけです。ただし、VCL 派生オブジェクトの使用には独自の制限があるため、ネイティブ C++ ソリューションがおそらく理想的です。

ご意見ありがとうございます。

4

3 に答える 3

8

Google グループの P4D プロジェクトを恐れる必要はありません。部分的には、非常に安定しており、すでにフル機能を備えているため、非アクティブに見えます。これらのコンポーネントは、現在利用可能な最高の Python 開発エディターの 1 つである、よりアクティブなPyScripterアプリケーションで使用されます。PyScripter は Delphi で作成され、P4D コンポーネントを使用します。そのため、P4D ソース チェックアウトで提供されている例はすでに開始するには十分ですが、P4D コンポーネントの使用方法の非常に包括的な例も示しています。

于 2010-08-10T09:42:17.153 に答える
1

内部クラスまたはインスタンス化されたオブジェクトをオブジェクトとして Python に公開するのは簡単ですか、それとも API は真に C スタイルまたはフラット / 非 OO ですか。

あなたはすでに自分自身に答えています。文の後半は正しいです。

オブジェクトとクラスは、コンパイルするとすぐに C++ には存在しません。RTTI が有効になっている場合、いくつかの構造 (vtables) と、いくつかの OO データを説明する別の構造だけが存在します。そのため、クラスとオブジェクトを使用して Python と C++ の間のギャップを埋めることができません。

C関数のセットといくつかのデータ構造を作成し、次にOOレイヤーを作成して、自分で確実に構築できます。しかし、すぐにそれを行うことはできません。

たとえば、クラス Car:

class Car {
public:
  int getDoors()
      { return this->doors; }
protected:
  int doors;
};

次のように翻訳されます。

struct Car {
    int doors;
};

int Car_getDoors(Car * this)
{
    return this->doors;
}

getDoors への呼び出し:

 c->getDoors()

次のように翻訳されます。

Car_getDoors( c )
于 2010-08-10T08:48:08.813 に答える
0

swigを使用して、C++ to $SCRIPTLANG ラッパーを生成できます。

于 2010-08-10T11:24:41.890 に答える