欢迎访问我的博客首页。
Python 调用 C++
- 1. pybind11
- 1.1 使用 cmake 编译
- 1.2 使用 visual studio 编译
- 1.3 使用 cmake 生成 vs 项目
- 2. ctypes
- 3. 参考
使用 pybind11 创建一个 class="superseo">python 扩展模块,并使用 python 测试。
1.1 使用 cmake 编译-
配置 pybind11
下载 pybind11,确保文件夹名称为 pybind11,无需编译和安装。 -
新建 main.cpp
这个例子实现了两个函数,一个使用 lambda 函数实现加法,一个实现减法。
#include
namespace py = pybind11;
int subtract(int a, int b) { return a - b; }
PYBIND11_MODULE(example, m) {
m.doc() = "pybind11 example module";
m.def("add", [](int a, int b) { return a + b; });
m.def("subtract", &subtract);
}
- 编辑 cmake 配置文件
cmake_minimum_required(VERSION 3.2)
project(test)
include_directories(pybind11/include) # 指定 pybind11/pybind11.h 所在文件夹。
add_subdirectory(pybind11) # 下载得到的 pybind11。
pybind11_add_module(example main.cpp) # 使用 pybind11 的命令生成 python 扩展模块。
- 编译
新建文件夹 build,在其中依次执行下面的命令,生成 example.cp37-win_amd64.pyd。生成的扩展模块名字的某些字段会因不同的 python 版本和平台而有所差异。
cmake -G "MinGW Makefiles" ..
make
- 测试
在 build 文件夹中创建 main.py,运行即可看到结果。
import example
if __name__ == '__main__':
print(example.add(1, 2))
print(example.subtract(1, 2))
pybind11 是一个 C++ 库,它能把用 C++ 语言写的代码编译成 python 扩展模块。注意两个命令 PYBIND11_MODULE 与 pybind11_add_module 指定的扩展模块名必须一致。
1.2 使用 visual studio 编译-
创建 vs 项目
创建空项目,项目名称为 example,解决方案名称为 exampleproject。 -
准备第三方库
2.1 下载 pybind11,得到文件夹 pybind11。
2.2 假如使用的 python 版本是 3.8。创建文件夹 python38,拷入 python3.8 安装位置中的 include 和 libs 文件夹。
2.3 在文件夹 exampleproject/example 中新建文件夹 thirdpart,拷入上面得到的两个文件夹 pybind11 和 python38。 -
配置 vs 属性
3.1 在常规选项卡上,设置目标文件扩展名为 .pyd,设置配置类型为动态库(.dll)。有的版本的 vs,目标文件扩展名在高级选项卡上。
3.2 设置包含目录为 thridpart\pybind11\include 和 thridpart\python38\include。设置库目录为 thridpart\python38\libs。设置附加依赖项为 python3.lib 和 python38.lib。 -
添加 main.cpp 生成 example.pyd。
-
测试
因为编译扩展模块时使用了 python 环境,所以测试也要在该 python 环境下进行。
上面的两种方法中,使用 cmake 编译不需要 python 环境;使用 visual studio 编译需要 python 环境,且只能在该环境下运行,移植性差。原因是,使用 cmake 时,我们用的编译命令是 pybind11 的 pybind11_add_module;使用 vs 时,我们没有用 pybind11 的命令,而是把它当作 dll 编译。
一些第三方库很容易在 vs 上配置,却不一定能在 cmake 上配置,因此使用 vs 编译 python 扩展模块是很有必要的。这时,我们可以先用 cmake 编译上面那样简单的 pybind11 例程,然后生成 vs 项目,接着在 vs 项目上配置第三方库,再把例程修改为需要的代码,最后就可以生成名字类似 example.cp37-win_amd64.pyd 的 python 扩展模块了。
2. ctypes3. 参考
- pybind11 的安装与配置使用,CSDN,2022。
- pybind11在visual studio中的配置,CSDN,2022。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)