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

Posted

技术标签:

【中文标题】我可以在扩展 Python 时使用 C++ 功能吗?【英文标题】:Can I use C++ features while extending Python? 【发布时间】:2009-07-26 23:30:23 【问题描述】:

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

【问题讨论】:

看看***.com/q/10368141/151641的答案 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

它被称为:Boost.Python

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

【讨论】:

【参考方案3】:

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

【讨论】:

如果您主要针对 C++,SWIG 绝对不是您想要使用的工具。如果它只是您正在使用的一小部分内容,它对 C++ 的理解足以将其包装起来很方便,但它无法触及 Boost.Python 以获得 C++ 支持。 @Nick:我查看了 Boost::Python 库,但我不相信它更胜一筹。 Boost 使用的所有模板和宏魔法都可能是脆弱的,它限制了代码可以做的事情。 为什么投反对票?这是一个比“答案”更有用的答案。 @Seth:你发现哪些部分很脆弱?你遇到了什么限制?我发现 Boost.Python 非常灵活和健壮。不要误会 - SWIG 是一个很好的库,但如果我只是连接 C++ 和 Python,我总是更喜欢 Boost.Python...【参考方案4】:

您应该能够使用 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 库链接时得到未解析的外部。

【讨论】:

当然,这些问题与任何 C 到 C++ 的链接都是一致的,并不是 Python 独有的。如果您控制 Python 解释器的构建过程(例如,您正在嵌入和扩展,而不仅仅是扩展),那么您无需担心这一点,因为您可以使用 C++ 编译器和链接器构建 Python。

以上是关于我可以在扩展 Python 时使用 C++ 功能吗?的主要内容,如果未能解决你的问题,请参考以下文章

“C++ 应用程序可以在完成时发出 python 脚本信号”吗?

使用C++扩展Python的功能 转自:http://blog.csdn.net/magictong/article/details/8897568#comments

最新版本的 VSCode 可以使用 C++ 扩展和 MSVC 调试 C++ 吗?

使用多线程 C++ 扩展时是不是需要注意 Python GIL?

使用pybind11开发python扩展库

Python 非平凡的 C++ 扩展