任何人都可以给我一些关于使用C / C ++扩展Python的工具或软件的提示吗?感谢。
答案 0 :(得分:13)
Python网站本身有一个很棒的set of examples,以及API documentation。这就是我在需要编写C扩展时使用的所有内容。
答案 1 :(得分:13)
我将为{+ 3}}添加对C ++内容的强制性引用。
答案 2 :(得分:8)
我们使用SWIG来包装我们的C / C ++库,以便在Python中使用。它运作得很好。
答案 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好得多:
使用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存储库,有很多信息,还有features和goodies的完整列表。
带有示例的文档可以在here中找到。
答案 8 :(得分:0)
也许this example有帮助。我认为这很简单:)