- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
为 C++ 库创建 Python 接口(interface)的最佳/标准方法是什么?
我知道这个问题以前在这里被问过,但那是在 2008 年,从那时起事情可能/可能已经发生了变化。
我环顾四周并测试了几种不同的方法,但无法确定哪种方法最好。到目前为止,我已经尝试过 Swig、ctypes 和 cppyy,并且认为 cppyy 是迄今为止最容易/最快实现的。我已经看到了对 Swig 的建议,但是让 Swig 工作需要很长时间,结果并不令人印象深刻。有现行标准吗?为什么人们如此推荐 Swig 而我却没有听到 cppyy 的消息?谢谢你。
最佳答案
SWIG 自 1996 年 2 月以来一直存在,并支持多种语言,而不仅仅是 Python。尽管现在的 cppyy 始于 2003 年 2 月,作为 RootPython,它始终嵌入了 ROOT (http://root.cern.ch),并且不能独立使用。自今年 3 月以来,才在 PyPI 上为所有三个主要平台进行了完整、简单的轮子安装,而在 conda-forge(适用于 Linux 和 Mac)上仅在两个月后才出现。因此,尽管它有很长的谱系,但在更广泛的 Python 世界中,cppyy 确实非常新鲜,这就是为什么我怀疑很多人还没有听说过它,而 SWIG 是它们的(精神)祖先。
努力使 cppyy 可用的原因是它提供了很多其他绑定(bind)器没有的功能,并且不容易添加:兼容的 C++17 解析器(Clang/LLVM 的 b/c );自动模板实例化、交叉继承和回调,所有这些都在运行时(Cling 的 b/c);和更好的性能。它也不会创建 C 扩展模块,因此您只需为不同版本的 Python 重新编译 cppyy 本身,而无需绑定(bind)代码。
现在,你的第一个问题是什么是最好的。好吧,这取决于用例。例如,如果您需要更多的绑定(bind)而不仅仅是 Python,那么 SWIG 是您的最佳选择。如果您有很多无法在构建时全部实例化的模板,需要性能和可扩展性,或者有一个具有大量接口(interface)的 C++ 框架,那么 cppyy 很难被击败。如果您有现代 C++ 并且不希望对外部库有任何运行时依赖,那么 PyBind11 就是它所在的位置。
这些天我不能推荐ctypes。唯一真正的好处是它是大多数 Python 的内置模块,但随着 PyPI 和 conda 的出现,它变得毫无意义。如果你想要一个超轻量级的 C 绑定(bind)器(不是 C++,但你可以用 C 帮助程序包装这些函数),然后选择 CFFI。
至于您是否有标准的问题:不,没有一种粘合剂最适合所有用例。甚至比您提到的要多得多,但其中许多都在同一个空间中发挥作用(例如 SWIG 与 SIP,以及 PyBind11 与 boost.python),我不会推荐它们而不是您的那些已经试过了。我确实想指出 AutoWIG,它是一个使用 Clang 和 PyBind11 或 boost.python 代码作为输出的生成器;和 cython,它是一种类似 Python 的代码,用于编写 C 扩展模块,并且具有一些(有限的)C++ 支持。我一直觉得 cython 既不存在也不存在,但很多人都喜欢它,它在科学界和数学密集型代码中被广泛使用,因此证明了它的质量。
现在,即使没有“标准”,所有绑定(bind)器都可以将代理转换为 PyCapsule 对象并重新绑定(bind)它们。因此,尽管有时它有点笨拙,但您实际上可以在一个应用程序中混合活页夹。
最后一点:CFFI 和 cppyy(通过 CFFI 的后端)在 PyPy 上具有接近原生的性能。不幸的是,cppyy 在 PyPy 上不如在 CPython 上那么最新(例如,仍然缺少交叉继承),但它已经到了那里。其他绑定(bind)器通过 Python C-API 工作,该 API 在 PyPy 上具有完整功能,但会阻止 JIT 完成其工作,从而降低性能。
完全免责声明:我是 cppyy 的作者,这些天我只使用 cppyy、CFFI 和 PyBind11 来满足我的绑定(bind)需求。
关于python - 如何为 C++ 库实现 Python 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57862035/
我正在尝试在我的代码库中为我正在编写的游戏服务器更多地使用接口(interface),并了解高级概念以及何时应该使用接口(interface)(我认为)。在我的例子中,我使用它们将我的包相互分离,并使
我有一个名为 Widget 的接口(interface),它在我的整个项目中都在使用。但是,它也用作名为 Widget 的组件的 Prop 。 处理此问题的最佳方法是什么?我应该更改我的 Widget
有一个接口(interface)可以是多个接口(interface)之一 interface a {x:string} interface b {y:string} interface c {z:st
我遇到了一种情况,我需要调用第三方服务来获取一些信息。这些服务对于不同的客户可能会有所不同。我的界面中有一个身份验证功能,如下所示。 interface IServiceProvider { bool
在我的例子中,“RequestHandlerProxy”是一个结构,其字段为接口(interface)“IAdapter”,接口(interface)有可能被调用的方法,该方法的输入为结构“Reque
我有一个接口(interface)Interface1,它已由类A实现,并且设置了一些私有(private)变量值,并且我将类A的对象发送到下一个接受输入作为Interface2的类。那么我怎样才能将
假设我有这样的类和接口(interface)结构: interface IService {} interface IEmailService : IService { Task SendAs
有人知道我在哪里可以找到 XML-RPC 接口(interface)的定义(在 OpenERP 7 中)?我想知道创建或获取对象需要哪些参数和对象属性。每个元素的 XML 示例也将非常有帮助。 最佳答
最近,我一直在阅读有关接口(interface)是抽象的错误概念的文章。一篇这样的帖子是http://blog.ploeh.dk/2010/12/02/InterfacesAreNotAbstract
如果我有一个由第三方实现的现有 IInterface 后代,并且我想添加辅助例程,Delphi 是否提供了任何简单的方法来实现此目的,而无需手动重定向每个接口(interface)方法?也就是说,给定
我正在尝试将 Article 数组分配给我的 Mongoose 文档,但 Typescript 似乎不喜欢这样,我不知道为什么它显示此警告/错误,表明它不可分配. 我的 Mongoose 模式和接口(
我有两个接口(interface): public interface IController { void doSomething(IEntity thing); } public inte
是否可以创建一个扩展 Serializable 接口(interface)的接口(interface)? 如果是,那么扩展接口(interface)的行为是否会像 Serilizable 接口(int
我试图在两个存储之间创建一个中间层,它从存储 A 中获取数据,将其转换为相应类型的存储 B,然后存储它。由于我需要转换大约 50-100 种类型,我希望使用 map[string]func 并根据 s
我正在处理一个要求,其中我收到一个 JSON 对象,其中包含一个日期值作为字符串。我的任务是将 Date 对象存储在数据库中。 这种东西: {"start_date": "2019-05-29", "
我们的方法的目标是为我们现有的 DAO 和模型类引入接口(interface)。模型类由各种类型的资源 ID 标识,资源 ID 不仅仅是随机数,还带有语义和行为。因此,我们必须用对象而不是原始类型来表
Collection 接口(interface)有多个方法。 List 接口(interface)扩展了 Collection 接口(interface)。它声明与 Collection 接口(int
我有一个 Java 服务器应用程序,它使用 Jackson 使用反射 API 对 DTO 进行一般序列化。例如对于这个 DTO 接口(interface): package com.acme.libr
如果我在 Kotlin 中有一个接口(interface): interface KotlinInterface { val id: String } 我可以这样实现: class MyCla
我知道Java中所有访问修饰符之间的区别。然而,有人问了我一个非常有趣的问题,我很难找到答案:Java 中的 private 接口(interface)和 public 接口(interface)有什
我是一名优秀的程序员,十分优秀!