9

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

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

我的环境是:

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

当我为 Swig 创建接口文件时,我可以做一些简单的事情,比如:

```

%module filegdbapi

%{
#include "FileGDBAPI.h"
%}

%include "FileGDBAPI.h"

```

然后在 swig 构建中,我可以引用-I.h 文件的位置。

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

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

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

谢谢

4

3 回答 3

5

尽管用途相同,但 SWIG 和 Pybind11 是不同的工具。

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

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

于 2017-09-12T12:55:06.617 回答
1

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

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

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

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

基本用法似乎很简单,类似于你对 SWIG 的描述

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

2) 生成绑定代码

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

Binder 是旨在自动化步骤 1 和 2 的工具。

不幸的是,它似乎只适用于 Linux,因此要在 Windows 下使用它,您需要安装虚拟 Linux 或使用带有构建工具的 Docker 容器。

于 2018-07-12T14:43:39.110 回答
0

您可能需要cffi对此进行调查。

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

这对于使用它的示例项目:

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

顺便说一句,您也可以随其一起发布代码pypy,有些人可能会认为这是一个加分项。

于 2017-09-18T09:20:25.793 回答