使用C / C ++扩展Python

时间:2009-07-02 19:42:30

标签: c++ python c

任何人都可以给我一些关于使用C / C ++扩展Python的工具或软件的提示吗?感谢。

9 个答案:

答案 0 :(得分:13)

Python网站本身有一个很棒的set of examples,以及API documentation。这就是我在需要编写C扩展时使用的所有内容。

答案 1 :(得分:13)

我将为{+ 3}}添加对C ++内容的强制性引用。

答案 2 :(得分:8)

我们使用SWIG来包装我们的C / C ++库,以便在Python中使用。它运作得很好。

http://www.swig.org/

答案 3 :(得分:6)

我看到没有人指出我最喜欢的包装C ++代码的解决方案之一,SIP(我相信它也适用于包装C,就像SWIG一样,与Boost不同,但我从未使用过这种方式) 。这是Riverbank软件开发的工具PyQt,它是美妙的Qt C ++跨平台框架的Python接口 - 所以如果您的C ++代码使用任何Qt功能,它就是一个自然的选择,就像Boost Python是C ++代码的自然选择一样使用Boost。

SWIG是我们在工作中使用的(10年前做出的合理决定;-)并且具有理论上的优势,它还可以包装C或C ++代码以供Java,Perl,Tcl等使用 - 但是如果你只关心Python,很难看到任何让它脱颖而出的东西。

如果你只是包装一个现有的DLL /,除了Cython之外,其他答案已经指出了(我赞同,但是 - 它现在变化得非常快,所以如果你需要更稳定的东西要小心),考虑标准功能模块ctypes - 我不会将它用于非常广泛的工作(C或C ++编译器指出的“oops”错误可能导致运行时崩溃与ctypes),但对于小型作业它很棒(而且非常方便,因为它带有标准的Python发行版! - 。)。

优秀的旧C API还没有死 - 今天刚刚遇到了Case,这位伟大的家伙最近为我的旧开源项目gmpy做了大部分的操作,我们一起决定坚持下去使用C API进行至少gmpy的下一个版本 - 我们会考虑在稳定时切换到Cython,但我们同意交换机现在仍然有点过早。 (我们甚至没有想到任何其他选择,因为gmpy的主要观点是尽可能快地制造它! - 。)。

答案 4 :(得分:3)

有很多解决方案。一般来说,如果可能的话,你应该避免使用它,因为编写C扩展是很乏味的。通常,有必要使用第三方库。在这种情况下,我认为今天获胜的解决方案是cython

Cython是一种“看起来像python”的语言,但通过使用可选的输入可以更快。你可以在里面直接调用C函数,并且大多数引用计数(C扩展中的难题)都是自动完成的。根据我的经验,它比boost.python,swig或ctypes好得多:

  • boost.python只对包装C ++扩展IMHO有意义。我发现它太复杂了,当出现问题时很难调试。
  • swig有一些开销,并没有导致良好的代码。它适用于几个函数,但非平凡的扩展通常使用类型映射,语法很快就会变得丑陋

使用cython,您可以使用python对象(list,dict等...)来包装C库。当然,如果您出于速度原因需要编写自己的扩展,它也非常有用。在科学python社区,我认为cython已成为需要速度时的首选工具。

答案 5 :(得分:3)

我过去曾使用pycxx,我很高兴使用这个lib。

在我看来,它比SWIG更容易使用。我无法与boost.python进行比较,因为我从未真正使用过boost。我认为pycxx比boost.python轻,但我可能错了。

pycxx的关键点在于它是python c api的c ++包装器。它是面向对象的,它隐藏了所有困难的机制。这对python程序员来说非常直观。它非常易于使用,并且有一些很好的入门示例。

我建议pycxx作为在c ++中进行python扩展的一等公民。

答案 6 :(得分:2)

是的,您需要这样:http://www.python.org/doc/ext/

当然还有C / C ++编译器。

如果你描述了你想要做什么,以及你正在做什么样的扩展,我相信人们可以给你更多的信息。

有一些像SWIG这样的东西来包装库,如果这是你想要做的。如果你只想要加速,C往往是答案,但并非总是如此。

答案 7 :(得分:1)

令我惊讶的是,没有人提到pybind11。 Pybind11是amazing

来自他们的文档:

  pybind11是一个轻量级的仅标头的库,它公开了Python中的C ++类型,反之亦然,主要是创建现有C ++代码的Python绑定。其目标和语法类似于David Abrahams出色的Boost.Python库:通过使用编译时自省来推断类型信息,从而最大程度地减少了传统扩展模块中的样板代码。

...

  

将此库视为Boost.Python的小型独立版本,其中删除了与绑定生成无关的所有内容。无需注释,核心头文件仅需要约4K行代码,并依赖于Python(2.7或3.x,或PyPy2.7> = 5.7)和C ++标准库。

检查pybind11 github存储库,有很多信息,还有featuresgoodies的完整列表。

带有示例的文档可以在here中找到。

答案 8 :(得分:0)

也许this example有帮助。我认为这很简单:)