如何实现C++库的Python接口

2024-04-25 01:53:41 发布

您现在位置:Python中文网/ 问答频道 /正文

< >为C++库创建Python接口的最佳方法是什么?在

我知道以前有人问过这个问题,但那是在2008年,从那以后事情可能/可能已经改变了。在

我环顾四周,测试了几种不同的方法,但无法决定哪种方法最好。到目前为止,我已经尝试过Swig、ctypes和cppyy,认为cppyy是迄今为止实现最简单/最快的方法。我看过很多关于Swig的推荐,但是花了很长时间才让Swig发挥作用,结果并不令人印象深刻。是否有现行标准?为什么人们推荐这么多酒,而我却听不到cppyy?非常感谢。在


Tags: 方法ctypes事情swig印象发挥作用cppyy现行标准
1条回答
网友
1楼 · 发布于 2024-04-25 01:53:41

SWIG从1996年2月就出现了,它支持多种语言,而不仅仅是Python。尽管现在的cppyy作为RootPython于2003年2月启动,但它始终嵌入根(http://root.cern.ch),并且不能独立使用。三个主要平台的完整、简单、带轮子的安装只存在于今年3月,而conda forge(针对Linux&Mac)则从现在起才存在两个月。因此,尽管cppyy有着悠久的血统,但在更广阔的Python世界中,cppyy确实相当新鲜,这就是为什么我怀疑很多人还听说过它,而SWIG是它们的(精神)祖先。在

之所以努力使CPPYY有效,是因为它提供了许多其他绑定不具备的特性,而且不容易添加:兼容的C++ 17解析器(BLA/LCVM的B/C);自动模板实例化、交叉继承和回调,所有在运行时(B/C的CLAN);以及更好的性能。它也不创建C扩展模块,因此您只需要为不同版本的Python重新编译cppyy本身,而不需要为绑定的代码重新编译。在

现在,你的第一个问题是什么是最好的。嗯,这取决于用例。例如,如果您需要比Python更多的绑定,SWIG是最好的选择。如果你有很多模板,你不能在构建时都实例化,需要性能和缩放,或者有很多接口的C++框架,那么CPPYY很难被击败。如果您拥有现代C++,并且不希望对外部库具有任何运行时依赖性,那么PybDun11就是它所在的位置。在

现在我不能推荐ctypes。唯一真正的好处是,它是一个内置模块,大多数Python在野外,但随着PyPI和conda的出现,这变得毫无意义。如果你想要一个超级轻C绑定器(不是C++,但是你可以用C助手包这些函数),那么就去CFFI。在

至于你的问题,是否有一个标准:不,没有一个绑定器对所有用例都是最好的。甚至还有很多比你提到的要多的,但是很多都是在同一个空间里玩的(比如SWIG vs.SIP,PyBind11 vs。boost.python)我不会推荐你已经试过的。我想指出的是AutoWIG,它是一个利用Clang和PyBind11或boost.python作为输出的代码;Cython,它是一个Python代码,用来编写C扩展模块,并且具有一些(有限)C++支持。我一直觉得cython既不在这里也不在那里,但很多人都喜欢它,它在科学界和数学重代码中被广泛使用,因此它的质量是有保证的。在

现在,即使没有“标准”,所有绑定器都可以将代理转换为PyCapsule对象并重新绑定它们。因此,尽管有时有点笨重,但实际上可以在一个应用程序中混合粘合剂。在

最后一点:CFFI和cppyy(通过CFFI的后端)在PyPy上具有近乎本机的性能。不幸的是,cppyy在PyPy上并没有CPython上的更新(例如,交叉继承仍然缺失),但它正在实现。其他绑定器通过PythonC-API工作,该API在PyPy上完全起作用,但是阻止了JIT的工作,从而降低了性能。在

完全免责声明:我是cppyy的作者,现在我只使用cppyy、CFFI和PyBind11来满足我的绑定需求。在

相关问题 更多 >