Python 调用 C++

Python 调用 C++,第1张

欢迎访问我的博客首页。


Python 调用 C++
  • 1. pybind11
    • 1.1 使用 cmake 编译
    • 1.2 使用 visual studio 编译
    • 1.3 使用 cmake 生成 vs 项目
  • 2. ctypes
  • 3. 参考

1. pybind11

  使用 pybind11 创建一个 class="superseo">python 扩展模块,并使用 python 测试。

1.1 使用 cmake 编译
  1. 配置 pybind11
      下载 pybind11,确保文件夹名称为 pybind11,无需编译和安装。

  2. 新建 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);
}
  1. 编辑 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 扩展模块。
  1. 编译
      新建文件夹 build,在其中依次执行下面的命令,生成 example.cp37-win_amd64.pyd。生成的扩展模块名字的某些字段会因不同的 python 版本和平台而有所差异。
cmake -G "MinGW Makefiles" ..
make
  1. 测试
      在 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 编译
  1. 创建 vs 项目
      创建空项目,项目名称为 example,解决方案名称为 exampleproject。

  2. 准备第三方库
    2.1 下载 pybind11,得到文件夹 pybind11。
    2.2 假如使用的 python 版本是 3.8。创建文件夹 python38,拷入 python3.8 安装位置中的 include 和 libs 文件夹。
    2.3 在文件夹 exampleproject/example 中新建文件夹 thirdpart,拷入上面得到的两个文件夹 pybind11 和 python38。

  3. 配置 vs 属性
    3.1 在常规选项卡上,设置目标文件扩展名为 .pyd,设置配置类型为动态库(.dll)。有的版本的 vs,目标文件扩展名在高级选项卡上。
    3.2 设置包含目录为 thridpart\pybind11\include 和 thridpart\python38\include。设置库目录为 thridpart\python38\libs。设置附加依赖项为 python3.lib 和 python38.lib。

  4. 添加 main.cpp 生成 example.pyd。

  5. 测试
      因为编译扩展模块时使用了 python 环境,所以测试也要在该 python 环境下进行。

1.3 使用 cmake 生成 vs 项目

  上面的两种方法中,使用 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. ctypes
3. 参考
  1. pybind11 的安装与配置使用,CSDN,2022。
  2. pybind11在visual studio中的配置,CSDN,2022。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/3002139.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-27
下一篇 2022-09-27

发表评论

登录后才能评论

评论列表(0条)

保存