【问题标题】:pybind11 wrapping existing codepybind11 包装现有代码
【发布时间】:2023-03-08 05:32:01
【问题描述】:

我正在尝试使用 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 filegdbapi

%{
#include "FileGDBAPI.h"
%}

%include "FileGDBAPI.h"

```

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

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

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

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

谢谢

【问题讨论】:

    标签: python c++ pybind11


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      如何在 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 容器。

      【讨论】:

        【解决方案3】:

        您可能需要为此查看cffi

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

        这是一个使用它的示例项目:

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

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

        【讨论】: