6

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

4

4 回答 4

9

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

于 2009-07-26T23:44:31.390 回答
3

boost 人员有一种很好的自动化方式来包装 C++ 代码以供 python 使用。

它被称为:Boost.Python

它比 SWIG 更好地处理 C++ 的一些结构,尤其是模板元编程。

于 2009-07-27T00:22:12.570 回答
2

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

于 2009-07-26T23:46:42.447 回答
1

您应该能够使用 C++ 语言的所有功能。扩展 Python 文档 (2.6.2)说您可以使用 C++,但提到以下注意事项:

可以用 C++ 编写扩展模块。一些限制适用。如果主程序(Python 解释器)由 C 编译器编译和链接,则不能使用带有构造函数的全局或静态对象。如果主程序由 C++ 编译器链接,这不是问题。Python 解释器将调用的函数(特别是模块初始化函数)必须使用 extern "C" 声明。没有必要将 Python 头文件包含在 extern "C" {...} 中——如果定义了符号 __cplusplus(所有最近的 C++ 编译器都定义了这个符号),它们已经使用这种形式。

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

class Foo { Foo() { } };

static Foo f;

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

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

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

void a_function_python_calls(void* foo);

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

于 2009-07-27T00:23:37.390 回答