pybind11包装现有代码

时间:2017-09-07 10:40:57

标签: python c++ pybind11

我正在尝试使用pybind11包装一个c ++库,所以我可以在Python 3.x中使用它。

我尝试使用swig包装代码,但我遇到了一个问题,SWIG会生成cxx文件,但不会读取我引用的标题,因此建议我使用pybind11,因为它更好而不是swig(这是我所知道的意见),但我无法找到有关如何引用/构建项目的资源。

我的环境是:

  • Windows 10 x64
  • Anacondas使用Python 3.6构建4.4.0
  • Visual Studios 2015 Professional(已安装c ++)

当我为Swig创建我的界面文件时,我可以做一些简单的事情:

```

module com.lapots.breed.platform.cloud.javacloudsample {
    requires spring.boot;
    requires hibernate.jpa;
    requires spring.web;
    requires spring.boot.autoconfigure;
}

```

然后在swig构建中,我可以将%module filegdbapi %{ #include "FileGDBAPI.h" %} %include "FileGDBAPI.h" 引用到.h文件的位置。

我如何在pybind11中做这样的事情?这么简单吗?

当您拥有.cpp文件时,pybind11的文档始终显示构建包装器。我可以用一种方法来使用pybind11,我可以用swig构建一个包装器吗?如果是这样,你如何设置文件?

有人能指出我只是从现有的c ++代码生成python包装器的项目吗?

谢谢

3 个答案:

答案 0 :(得分:4)

尽管服务于同一目的,但SWIG和Pybind11是不同的工具。

顾名思义,SWIG(Simplified Wrapper和Interface Generator )是一个生成器工具,它使用以特殊语言编写的定义为现有C ++代码创建Python绑定。

另一方面,Pybind11是一个仅包含标头的C ++库,它包含原始的Python-C API(这是旧式的C并且具有陡峭的学习曲线),并允许在现代C ++中编写Python绑定。但是,您可以使用pybind11::命名空间提供的任何C ++实体(函数,类,模板等)手动编写自己的绑定。

答案 1 :(得分:1)

  

如何在pybind11中执行类似的操作?这么简单吗?

     

有人可以指出我一个仅从现有c ++代码生成python包装器的项目吗?

您可以检查Binder项目http://cppbinder.readthedocs.io

  

Binder是使用Pybind11和Clang LibTooling库为C ++ 11项目自动生成Python绑定的工具。也就是说,Binder接受了一个C ++项目并将其编译为在Python中都可用的对象和函数。活页夹与以前的工具的不同之处在于,它处理C ++ 11中新增的特殊功能。

基本用法非常简单,类似于您对SWIG的描述

  

1)收集有关哪些类/功能可用的数据,并获取有关类继承,成员功能和独立功能类型签名的深入信息。

     

2)生成绑定代码

     

3)将代码编译到共享库中

     

活页夹是旨在自动执行步骤1和2的工具。

一个不幸的消息是它似乎仅是Linux,因此要在Windows下使用它,您将需要安装虚拟Linux或使用带有构建工具的Docker容器。

答案 2 :(得分:0)

您可能需要查看cffi

http://cffi.readthedocs.io/en/latest/

这是使用它的示例项目:

https://github.com/wolever/python-cffi-example

顺便提一下,您也可以使用pypy发送代码,有些人可能会认为这是一个加号。