2012-04-28 13 views
1

私はCとC++の関係を理解し​​ているので、後者は基本的に前者の拡張であり、ある程度の下位互換性を保持しています。 Python C APIをC++コードで呼び出すことはできますか?python C APIはC++と完全に互換性がありますか?

これまでのところ、公式のPythonのドキュメントでは、CとC++の拡張機能を同じページにまとめています。私はC++ APIを見つけることができません。これにより、同じAPIが両方の言語で使用するのが安全だと私は信じています。

これを確認または拒否できますか?

EDIT:

私は、私ははるかに複雑、それは必要以上に私の質問をしたと思います。質問はこれです:私はPythonモジュールをC++で書くために何をしなければなりませんか?リストされているのと同じ指示に従うだけですか?C++の代わりにCコードを使用しますか?here?別のAPIはありますか?

+0

あなたはCからPythonのC APIを呼び出すことができるはず++いますが、PythonのCを書くことができないだろうC++のモジュール。 –

+0

@DanD。私はちょっと混乱しています。このページを見ると、http://docs.python.org/extending/extending.htmlで、CやC++でPythonを拡張する方法を扱っています。私の元の質問はちょっと複雑かもしれないので、私にそれを言い換えてください。私がPythonモジュールをC++で記述したいのであれば、そのページにあるもの(C++構造体を使用する以外)とは何か異なる必要がありますか?あなたの応答はこれが不可能であることを示唆しているようで、私の混乱です。 – blz

+0

@DanD。なぜ詳細をケア?もちろん、Pythonにエクスポートされた名前は、名前の変更(C言語では処理できないもの、つまり過負荷のようなものはエクスポートできません)のため、 'extern" C "{}'ブロックになければなりません。他のロードブロッキングを認識している。 – delnan

答えて

4

私は同じPython C APIがCとCの両方の言語で使用するのが安全であることを確認できます。 しかし、より具体的な質問をしない限り、より詳細な回答を提供することは困難です。あなたが知っておくべき多くの警告と問題があります。たとえば、Pythonの拡張はC++ではなくCの型structとして定義されているので、暗黙的にそのコンストラクタ/デストラクタを定義し、と呼ばれるがあるとは思わない。例えば

は、PythonのマニュアルのDefining New Typesからのサンプルコードを取って、それはC++のように書くことができ、あなたもブレンドインすることができますC++のタイプ:

// noddy.cpp 
namespace { 

struct noddy_NoddyObject 
{ 
    PyObject_HEAD 
    // Type-specific fields go here. 
    std::shared_ptr<int> value; // WARNING 
}; 

PyObject* Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 
{ 
    try { 
     Noddy *self = (Noddy *)type->tp_alloc(type, 0); 
     if (self) { 
      self->value = std::make_shared(7); 
      // or more complex operations that may throw 
      // or extract complex initialisation as Noddy_init function 
      return self; 
     } 
    } 
    catch (...) { 
     // do something, log, etc. 
    } 
    return 0; 
} 

PyTypeObject noddy_NoddyType = 
{ 
    PyObject_HEAD_INIT(NULL) 
    // ... 
} 

} // unnamed namespace 

しかし、のどちらもコンストラクタやデストラクタstd::shared_ptrが呼び出されます。 valuenullptrにリセットするnoddy_NoddyTypeには、dealloc関数を定義することを忘れないでください。なぜ値がshared_ptrと定義されていても迷惑をかけることがあります。 Python拡張をC++で使用し、型変換やキャストを避けたり、実装の定義内でよりシームレスに統合したり、例外に基づくエラー処理をより簡単にするなどの場合に便利です。 あなたのオブジェクトがdeallocのおかげで、valueのおかげで、純粋なCで実装された機械によって管理されているという事実は、よく知られているRAIIのルールに従ってリリースされます。

ここでは、C++言語でのPythonのC APIのほぼシームレスな統合の興味深い例を見つけることができます:How To catch Python stdout in c++ code

+0

まず、徹底的で詳細な回答をいただき、ありがとうございます。私はこれらの警告に全く気づかなかった!ただ一つの簡単な質問: 'boost.Python'を使ってこれらの問題のいくつかを避けることができますか?私は、このライブラリがPython.hよりもC++開発に適していると言われました。 – blz

+0

ようこそ。はい、もちろんBoost.Pythonはあなたのためにこのような問題のほとんどすべてを処理します。私の例は単純なPython C APIに基づいていますが、Boost.PythonはPython C APIの上にC++抽象化を提供しているので、ほとんどの問題を忘れることがあります。 – mloskot

+1

パーフェクト、私はブーストを見始めるでしょう。もう一度ありがとうございます - あなたのような有益な答えが私をSOに戻し続けるものです! – blz

1

Python C APIは、C++コード内で呼び出すことができます。 Python C++拡張機能は、C拡張機能と同じC APIを使用するか、boost::pythonなどのサードパーティAPIを使用して作成されます。

+0

華麗な、ありがとう!私はすぐにあなたの答えを受け入れるようになるでしょう。私はC++でコーディングするときに何か別のことをしなければならないのですか? – blz

関連する問題