我正在尝试使用pybind11包装一个c ++库,所以我可以在Python 3.x中使用它。
我尝试使用swig包装代码,但我遇到了一个问题,SWIG会生成cxx文件,但不会读取我引用的标题,因此建议我使用pybind11,因为它更好而不是swig(这是我所知道的意见),但我无法找到有关如何引用/构建项目的资源。
我的环境是:
当我为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包装器的项目吗?
谢谢
答案 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
发送代码,有些人可能会认为这是一个加号。