【问题标题】:How to wrap a c++ library for python?如何为 python 包装一个 c++ 库?
【发布时间】:2011-11-14 20:42:23
【问题描述】:

我有一个库和一些头文件,没有 c++ 源代码,我想将它与 python 一起使用。 我试过py++,但是gccxml报错。 我试过痛饮,但有很多“未定义的符号”错误。 有没有一些智能工具可以自动完成这些事情?

【问题讨论】:

    标签: c++ python


    【解决方案1】:

    你可以试试boost python

    您需要创建一个简单的包装 dll 链接到您的原始库,其中包含与此类似的代码(假设您要导出一个名为 LibraryClass 的类,其中包含 2 个函数 foo 和 bar)

    #include <librarytowrap.h>
    #include <boost/python.hpp>
    using namespace boost::python;
    
    BOOST_PYTHON_MODULE(Library)
    {
        class_<LibraryClass>("LibraryClass")
            .def("foo", &LibraryClass::foo)
            .def("bar", &LibraryClass::bar)
        ;
    }
    

    您也许可以使用the automatic code generator 来读取头文件中的 C++ 定义并为您完成繁重的工作,但根据 boost python 页面,这不再维护,所以我不确定它有多好有效。

    【讨论】:

    • 自动代码生成器使用gccxml,但是gccxml报头文件有错误。
    • 您可以尝试发布一个关于您从 gccxml 获得的错误的单独问题。也许有人可以帮忙。
    【解决方案2】:

    你不能只使用 python ctypes 包吗?

    看到这个tutorial。

    【讨论】:

    • ctypes 包装了 C 库。
    【解决方案3】:

    这种方法需要做一些工作,如果您有很多要包装的函数/这些函数使用大量 c++ 内在类型作为参数/返回值,则这种方法可能不可行。

    如果不是这样,你可以定义一些 c-wrapper 函数,在它们前面加上“extern c”关键字,带有纯 c 参数和返回类型。编译并将“包装函数”链接到您的 c++ 库。然后你可以使用 ctypes 模块(来自 python)来调用你的包装函数,然后再调用你库中的 c++ 函数。

    【讨论】:

      猜你喜欢
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 2016-12-23
      • 1970-01-01
      相关资源
      最近更新 更多