1

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

さらに重要なことに、公式のPythonドキュメントにはCとC++の拡張機能が同じページにバンドルされていることに気付きました。C++APIはどこにも見つかりません。これにより、同じAPIを両方の言語で安全に使用できると私は信じています。

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

編集:

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

4

2 に答える 2

4

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

たとえば、Pythonマニュアルの「新しいタイプの定義」のサンプルコードを使用すると、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呼び出されません。したがって、でリセットする場所のdealloc関数を定義することを忘れないでください。なぜ値をとして定義するのに悩むのか、あなたは尋ねるかもしれません。型変換とキャストを回避し、実装の定義内でよりシームレスな統合を行うために、例外を除いてC ++でPython拡張機能を使用する場合、例外に基づくエラー処理がより簡単になる可能性があります。のオブジェクトが純粋なCで実装された機械によって管理されているという事実は、機能のおかげで、よく知られているRAIIルールに従ってリリースされます。noddy_NoddyTypevaluenullptrshared_ptrnoddy_NoddyTypedeallocvalue

ここでは、Python CAPIとC++言語のほぼシームレスな統合の興味深い例を見つけることができます:c++コードでPythonstdoutをキャッチする方法

于 2012-04-28T22:50:07.780 に答える
1

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

于 2012-04-28T22:41:57.073 に答える