【发布时间】:2023-03-10 02:56:01
【问题描述】:
Python 手册说您可以在 C 和 C++ 中为 Python 创建模块。在使用 C++ 时,您可以利用类和模板之类的东西吗?它不会造成与其他库和解释器的不兼容吗?
【问题讨论】:
标签: c++ python c python-c-api python-c-extension
Python 手册说您可以在 C 和 C++ 中为 Python 创建模块。在使用 C++ 时,您可以利用类和模板之类的东西吗?它不会造成与其他库和解释器的不兼容吗?
【问题讨论】:
标签: c++ python c python-c-api python-c-extension
挂钩函数的实现是用 C 实现还是用 C++ 实现并不重要。事实上,我已经看到了一些 Python 扩展,它们积极使用 C++ 模板甚至 Boost 库。 没问题。 :-)
【讨论】:
boost 人员有一种很好的自动化方式来包装 C++ 代码以供 python 使用。
它被称为:Boost.Python
它比 SWIG 更好地处理 C++ 的一些结构,尤其是模板元编程。
【讨论】:
您感兴趣的是一个名为SWIG 的程序。它将为 C++ 代码生成 Python 包装器和接口。我将它与模板、继承、命名空间等一起使用,效果很好。
【讨论】:
您应该能够使用 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 扩展中有具有静态存储持续时间的对象并且 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 库链接时得到未解析的外部。
【讨论】: