同じ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_NoddyType
value
nullptr
shared_ptr
noddy_NoddyType
dealloc
value
ここでは、Python CAPIとC++言語のほぼシームレスな統合の興味深い例を見つけることができます:c++コードでPythonstdoutをキャッチする方法