【问题标题】:Wrapping C++ class to use in Python包装 C++ 类以在 Python 中使用
【发布时间】:2014-09-30 09:38:56
【问题描述】:

我有一个可以通过 C++ 类 (https://github.com/stanleyseow/RF24/tree/master/RPi/RF24) 控制的设备。

我希望能够在 Python 中使用这个类,并认为我可以包装它。

我找到了很多方法,但没有太多详细的示例文档。特别是,我发现了 Boost、Cython、SWIG 和原生 C Python API。

在什么情况下哪一种是最好的方法?您是否有一些指向有关此内容的详细文档/示例的链接?

谢谢!

【问题讨论】:

    标签: python c++ boost wrapper cython


    【解决方案1】:

    没有“最好”;这完全取决于您的情况。

    对于单个类,原生 C Python API 并不太难, 但是你必须创建一个完整的模块,然后是类。它 如果你暴露一个程序接口会更简单,而不是 比一个班级。如果您只有一个设备实例,则此 将是一个合适的解决方案。

    SWIG 非常适合采用 C++ 类定义和 生成一个包含它们的 Python 模块。所结果的 代码相对复杂,因为 SWIG 试图涵盖所有 Python 的可能版本;对于任何 2.7 或更高版本(和 也许早一点),你可以直接在 C++,没有任何中间 Python。

    Boost 广泛使用模板。这真的不是一个 问题的适当解决方案;它增加了很多 如果完成的话相对简单的事情的复杂性 外部工具,而不是元编程。不过,如果 潜在的复杂性不会吓到你,可能不是那样 很难用。

    我不熟悉 Cython。

    在全球范围内,如果你只有一个简单类的一个实例, 使用本机 C API 可能并不比 其他解决方案,并引入了最少的附加内部 复杂性。

    【讨论】:

    • 现在,我只需要这个类的一个实例。但是,如果能够处理一个类的多个实例并不复杂,我认为这可能是值得的。
    • 对不起,我把最后一条评论搞砸了……:现在,我只需要这个类的一个实例。但是,如果能够处理一个类的多个实例并不复杂,我认为这可能是值得的。我需要我生成的 Python 代码与 Python 3.3+ 兼容。我会看看 SWIG 和标准 C API。
    • 这有点复杂:您必须先创建模块及其功能,然后将类添加到其中。定义一个类并不复杂,但它很冗长:例如,您必须填写一个巨大的结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多