正如我所理解的,C和C++之间的关系,后者本质上是前者的扩展,并保持了一定程度的向后兼容性。假设用C++代码调用python是安全的吗?
更重要的是,我注意到正式的python文档将C和C++扩展捆绑在同一个页面上。我找不到一个C++ API。这使我相信在两种语言中使用相同的API是安全的。
有人能证实或否认这一点吗?
编辑:
我想我的问题比需要的要复杂得多。问题是:要用C++编写python模块,我必须做些什么?我是否只是遵循与列出的这里相同的指示,以C代码代替C++?有单独的API吗?
发布于 2012-04-28 14:50:07
我可以确认相同的Python在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
定义noddy_NoddyType
函数,其中您将用nullptr
重置value
。您可能会问,为什么还要麻烦地将值定义为shared_ptr
。如果您在C++中使用Python扩展(除了例外),以避免类型转换和转换,为了在实现定义中实现更无缝的集成,基于异常的错误处理可能会更容易,等等。尽管您的noddy_NoddyType
对象是由纯C实现的机器管理的,但是由于dealloc
函数的存在,value
将根据众所周知的RAII规则发布。
在这里,您可以找到关于Python与C++语言几乎无缝集成的有趣示例:如何在c++代码中捕获
发布于 2012-04-28 14:41:57
Python可以在C++代码中调用。Python扩展是使用C扩展使用的相同的C++ API编写的,或者是使用一些第三方API编写的,比如boost::python。
https://stackoverflow.com/questions/10368141
复制