我可以确认在 C 和 C++ 这两种语言中使用相同的 Python C API 是安全的。但是,除非您提出更具体的问题,否则很难为您提供更详细的答案。您应该注意许多警告和问题。例如,您的 Python 扩展被定义为 C 类型 struct,而不是 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
调用 的构造函数和析构函数。因此,请记住为您将重置with的位置定义dealloc
函数。您可能会问,为什么还要费心将值定义为。如果您在 C++ 中使用 Python 扩展(有异常)来避免类型转换和强制转换,在实现的定义中实现更无缝的集成,基于异常的错误处理可能会更容易等等,这很有用。尽管有事实上,你的对象是由纯 C 实现的机器管理的,这要归功于函数将根据众所周知的 RAII 规则发布。noddy_NoddyType
value
nullptr
shared_ptr
noddy_NoddyType
dealloc
value
在这里,您可以找到 Python C API 与 C++ 语言几乎无缝集成的有趣示例:How To catch Python stdout in c++ code