使用不同的 Python 工具接口 C/C++ [关闭]
Posted
技术标签:
【中文标题】使用不同的 Python 工具接口 C/C++ [关闭]【英文标题】:Interface C/C++ using different Python tools [closed] 【发布时间】:2016-09-16 22:25:52 【问题描述】:所以我正在做一个项目,需要我编写一些 python 代码来接口 C/C++ 程序,但我还没有决定应该使用哪个工具。直观地说,我想在pybind11 和Boost.Python 之间进行选择。程序员:两者的优缺点是什么?您将如何决定使用哪一个?
【问题讨论】:
没有提到 Cython? 我第二次包含 Cython - pybind11 基本上是 Boost.Python 核心习语的无升压实现。 Cython 是一个更好的比较点,因为它是一种完全不同的界面范例(不,一种不同的语言!) 更新 - 除了 pybind11 和 Boost.Python 之外,还写了一个针对 Cython 的答案 【参考方案1】:Boost.Python 的设计,据我所知,有两个主要目标:
-
为专业 Python C++ 开发人员提供 C++ 中的“pythonic”API 用于扩展开发 - 这样
... 这个 API 的架构师会尽最大努力将其目标开发者用户群与underlying Python C-API 的实现细节隔离开来——具体来说,他们不希望用户必须操纵
PyObject*
的值和引用计数。
如您所料,Boost.Python 使用来自无数低级 Boost 库的 Boost 原语来完成此任务——它做得很好:
-
如果您的项目已经开始使用 Boost,
适用于大约 98% 的可以想象的 Python 到 C++ 用例。
我个人不喜欢使用 Boost;如果您具有类似的性格并且能够为您的项目做出这种性质的执行决策,那么您可以获得我认为的 Boost.Python C++ API 的绝大多数Boost-如果您使用 pybind11,则依赖开销 - 一个利用 C++11 功能的较新项目,重新实现了伪 Pythonic API 所需的低级工具。
TL;DR: pybind11 是 Boost.Python,适用于对 Boost 有中度至重度过敏的开发人员。这两种工具都可以让您编写一个 C++ 层,通过一个或多个 Python 模块将您现有的 API(可能是函数、类型、模板等)公开为类似的 Python 结构。
相比之下:Cython 使用了完全不同的方法。 Cython 提供了 Python 语言的超集,它还提供了允许 C 和 C++ 原语与相关 Python 数据结构一起直接操作的关键字。这是一种完全不同的方法,适用于两个(通常有些正交的)用例:
-
通过明智地将“热门”惯用语从解释的 Python 域移到本机编译的 Cython 域来优化 Python 代码;和
为预先存在的 C 或 C++ 库提供 Python 接口。
...虽然这些是不同的任务,但通常编写扩展程序是为了比单独在 Python 中更快地运行某些东西,因此出于 #1 的原因使用 Cython 可以消除对 #2 的需求(无论使用何种工具)使用)。
我喜欢 Cython,但我发现当一个人对 C++ 非常了解时,它在接口方面的使用(使用 #2)会有所改进。拿起 Cython 并使用它来优化一些瓶颈的 Python 代码(使用 #1)非常容易,而无需成为专家级 C 黑客或 C++ 爱好者——但是,IMO,这并没有扩展到 Cythonic 接口。
当然,这是一个高度主观的评估——邀请提问者使用这些框架做一些示例程序,并得出他或她自己的结论。
【讨论】:
谢谢!这个很全面! @Javaian——不客气。如果 Cython 应该为您工作,请更新问题,是的!以上是关于使用不同的 Python 工具接口 C/C++ [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Python C/C++ 接口将实例成员函数作为 PyCFunction 类型传递
Python接口自动化测试框架(工具篇)-- 接口测试工具HTTPRUNNER