Pybind11的功能是通过Pybind11的Readme的以下引用来捕获的:
PYBIND11是一个仅轻质标题库,它在Python中揭示C ++类型,反之亦然,主要是为了创建现有C ++代码的Python绑定。它的目标和语法类似于David Abrahams的出色Boost.python图书馆...
BOOST.PYTHON的主要问题 - 创建这样类似项目的原因是Boost。 Boost是一套非常大的实用程序库,几乎与存在的每个C ++编译器一起使用。 ...现在C ++ 11兼容编译器已广泛使用,这种重型机械已成为过度且不必要的依赖性。
该存储库包含使用Pybind11的几个示例。即使PYBIND11开发人员提供的在线文档使其使用相对简单,但在此提供了几个示例,例如这里提供的示例 - 使Pybind11更易于使用。这些示例是为了让您使用pybind11更快地开始。但是,它们绝不是详尽的,并不总是提供最佳选择。因此,强烈建议您自己思考。此外,非常欢迎使用类似的简单示例(或通过进一步改善现有示例)的贡献。请在Github上提出拉请请求或问题,或与我联系。
在应得的信用额的地方给予信用:
Pybind11的创建者做得很好!它真的很容易使用,而且非常轻巧。同样,文档已经非常完整。
杜克大学的Cliburn Chan和Janice McCarthy提供的例子有很大的帮助。请阅读他们的文档。
请注意,在PYBIND11存储库中,还有一些测试案例将其兼作为示例,但是当您不熟悉Pybind11时,这些案例并不是很有见地。
最后,pybind11被积极使用。因此,人们可以在积极维护的特定解决方案中查看。例如:
PYBIND11模块(仅是标头!)作为此存储库的子模块。克隆该项目时需要注意。有两个选择:
最简单的选项是:
git clone --recursive https://github.com/tdegeus/pybind11_examples.git这将下载该项目中使用的版本。要更新子模块本身的最新提交:
git submodule update --remote也可以直接从源头下载subsodule:
git clone https://github.com/tdegeus/pybind11_examples.git
cd pybind11_examples
git submodule init
git submodule update特征库用于一些Numpy示例。从这些示例中可以看出,通过Pybind11,特征和Numpy确实是握手模块。创建C ++/Python接口几乎不需要代码。请注意,大多数简单性取决于所传递的副本,如果一个人想纯粹通过参考文献传递,就需要一些注意。
Eigen does not need installation because it is also header only.一个人只需要下载文件并在编译时包含标题即可。
通常,可以通过以下方式下载和安装特征:
mkdir /path/to/temp/build
cmake /path/to/eigen/download
make install对于Macos,一个人可以简单地使用
brew install eigen
此后编译
clang++ -I/path/to/eigen/instalation ...请注意,当正确配置时(通常情况下),PKG-Config可用于跟踪路径:
clang++ ` pkg-config --cflags eigen3 ` ...或者可以使用cmake(见下文)。
如果您有一个简单的库,则可能需要自己做所有事情。在这种情况下,您将C ++源编译到链接到Python的共享对象。这归结为
c++ -O3 -shared -std=gnu++11 -I ./pybind11/include ` python3-config --cflags --ldflags --libs ` example.cpp -o example.so -fPIC使用CMAKE可以非常容易地对Pybind11应用程序进行编译。为简单起见,为简单起见,Pybind11作为下面示例的子文件夹(实际上使用符号链接到许多副本),以便我们可以使用CMakeLists.txt类似:
cmake_minimum_required ( VERSION 2.8.12)
project (example)
add_subdirectory (pybind11)
pybind11_add_module(example example.cpp) (因此,此示例模块由单个源文件example.cpp组成)。要编译,请使用:
cd /path/to/build
cmake /path/to/example/src
make当“安装” eigen CMakeLists.txt
find_package ( PkgConfig )
pkg_check_modules( EIGEN3 REQUIRED eigen3 )
include_directories ( ${EIGEN3_INCLUDE_DIRS} )C ++ 14标准可以通过在CMakeLists.txt中包括以下内容来使用:
set (CMAKE_CXX_STANDARD 14)可以将文件setup.py添加到您的库中。然后,您可以编译并使用
python3 setup.py build
python3 setup.py install尽管编写setup.py并不难,但此处未涵盖。可以使用CPPMAT中包含的一些工具,这些工具可以与PIP一起安装(例如pip3 install cppmat )。此外,可以查看goosetensor或我的其他几个存储库的setup.py 。
此示例具有一个函数modify该函数获取列表(仅读取),将所有条目乘以两个,然后将其返回为双打列表(请参见example.cpp )。从python中,此函数包含在一个简单的模块example中(请参见test.py )。
此示例的目的是展示如何使函数接受列表,如何将其转换为标准的C ++ std::vector以及如何返回新的std::vector (或列表)。请注意,实际操作不是很重要,是说明的接口。
要编译,要么采用Cmake,因此通过随后从CMakeLists.txt读取编译说明:
cmake .
make或者,直接使用:
c++ -O3 -shared -std=gnu++11 -I ./pybind11/include ` python3-config --cflags --ldflags --libs ` example.cpp -o example.so -fPIC通过:
python3 test.py要使用Python 2运行,只需用“ Python”替换上面的“ Python3”的两个出现。要修改CMAKE指令在线查找更多。
与上一个示例相同,但带有嵌套列表。
一个函数modify将条目从一维数组转换为整数,然后将这些条目乘以10。
此示例的目的是展示如何使函数接受一维的numpy阵列,如何将其转换为标准的C ++ std::vector以及如何返回一维的Numpy阵列。请注意,使用PYBIND11生成的接口非常灵活,甚至接受Python侧的列表输入。
一个功能length 。此函数接受一个“矩阵”,其中包含二维位置向量的列表作为行。结果再次是一个“矩阵”,每行的“ x”和“ y”位置以及2-D位置向量的长度。
使用特征库的两个函数det and inv 。
此示例的目的是说明C ++/Eigen和Python/Numpy之间的相互作用是如何微不足道的。
要使用cmake进行编译并运行,请按照上述说明进行编译(其中包含在CMakeLists.txt中的特征标头。
c++ -O3 -shared -std=gnu++11 -I /path/to/eigen -I ./pybind11/include ` python3-config --cflags --ldflags --libs ` example.cpp -o example.so -fPIC例如,在MacOS上与自制的Macos:
c++ -O3 -shared -std=gnu++11 -I /usr/local/Cellar/eigen/3.3.1/include/eigen3 -I ./pybind11/include ` python3-config --cflags --ldflags --libs ` example.cpp -o example.so -fPIC带有一个函数mul自定义CustomVectorXd类。该课程使用特征库。它还包括一个默认参数。
此外,此示例具有函数trans (完全与自定义CustomVectorXd类无关)。目的是展示如何返回新的Eigen::VectorXi (或numpy-array)。
一个超载功能mul 。如果将其称为int参数或double参数,则此功能将“不同”。请注意,pybind11的默认行为非常强大。当用一个int和一个double参数调用该函数时,该模块将选择mul的double版本(并将int参数投入double )。
要编译,请确保使用C ++ 14标准,例如以-std=c++14作为编译器参数。
类似于上一个示例,但具有特征参数(即来自Python侧的numpy参数)。
要编译,请确保使用C ++ 14标准。
此示例包括C ++中的自定义矩阵类(在matrix.h中)。使用简单的接口(在pybind_matrix.h中)将此类耦合到numpy-array。因此,功能(例如example.cpp )不需要任何特殊的包装代码。
另请参阅有关堆栈溢出的讨论。
此示例具有与C ++中的枚举器接口的一种方法。原则上,界面很简单,但值得一个“技巧”。在这里,subsodule可以用与C ++中的相同方式与枚举者进行交互。
此示例包含一个经典示例,其中一个或多个类是从某个父母或模板派生的。这个特定的例子包含两只动物,一只Dog和一只Cat ,它们都来自通用Animal类。有一个功能talk ,可以接受通用Animal ,因此可以接受任何派生的阶级。
如文档中所述,这种特殊情况需要更多涉及的接口。
该示例具有一个简单的CRTP,其中具有“基础”和“派生”类,以及对PYBIND11 API的注册。
有时py::overload_cast无法解决您的功能,例如当无法推断返回类型时。在这种情况下,您可以通过static_cast向您的功能指示进行明确说明,可以在文档中找到更多信息。