我可以在扩展Python时使用C ++功能吗?

时间:2009-07-26 23:30:24

标签: c++ python c python-c-api python-c-extension

Python手册说您可以在C和C ++中为Python创建模块。使用C ++时,您可以利用类和模板之类的东西吗?它不会与其他库和解释器产生不兼容性吗?

4 个答案:

答案 0 :(得分:8)

钩子函数的实现是用C还是用C ++实现并不重要。事实上,我已经看到一些Python扩展,它们积极使用C ++模板甚至是Boost库。 没问题。: - )

答案 1 :(得分:3)

增强人员有一个很好的自动方式来包装C ++代码供python使用。

它被称为:Boost.Python

它比SWIG更好地处理C ++的一些构造,特别是模板元编程。

答案 2 :(得分:2)

您感兴趣的是一个名为SWIG的程序。它将为C ++代码生成Python包装器和接口。我将它与模板,继承,命名空间等一起使用,效果很好。

答案 3 :(得分:1)

您应该能够使用C ++语言的所有功能。 Extending Python Documentation (2.6.2)表示您可以使用C ++,但提到以下警告:

  

可以编写扩展名   C ++中的模块。一些限制   应用。如果是主程序(Python   解释器)由编译和链接   C编译器,全局或静态   具有构造函数的对象不能   用过的。如果这不是问题   主程序由C ++链接   编译器。功能将是   由Python解释器调用(在   特别是模块初始化   函数)必须使用声明   外部“C”。没有必要   将Python头文件括起来   extern“C”{...} - 他们使用这种形式   已经符号__cplusplus了   定义(所有最近的C ++编译器   定义这个符号)。

第一个限制是“无法使用构造函数的全局或静态对象”,这与大多数C ++编译器使用此类存储持续时间初始化对象的方式有关。例如,请考虑以下代码:

class Foo { Foo() { } };

static Foo f;

int main(int argc, char** argv) {}

编译器必须发出特殊代码,以便在执行main之前为'f'调用'Foo'构造函数。如果在Python扩展中有静态存储持续时间的对象,则不会为C ++编译和链接Python解释器,那么将不会创建此特殊初始化代码。

第二个限制,“Python解释器调用的函数(特别是模块初始化函数)必须使用extern”C“声明,与C ++名称修改有关。大多数C ++编译器都会破坏它们的名称,以便它们可以使用为C工具链提供的相同链接器。比如说你有:

void a_function_python_calls(void* foo);

C ++编译器可能会将名称'a_function_python_calls'的引用转换为'a_function_python_calls @ 1vga'之类的内容。在这种情况下,当您尝试链接Python库时,您可能会得到一个未解析的外部。