使用pybind11开发可供python使用的c++扩展模块

在做紫微斗数程序的时候用到了padas库,不过也只用了它下面几个功能:

1、读入csv文件,构造DataFrame;

2、通过行列标题查找数据;

3、通过行标题读取一行数据。

用这几个功能却导入了pandas、numpy、dateutil、pytz等一堆库,多少有点划不来,于是想用c++开发一个实现这几个功能的库供紫微斗数程序使用。按照AI的提示和网上搜索到的文章来了一番操作,结果硬是没成功,最后是微软的visual studio官方文档给了我启发,最终弄清了操作过程。如果想使用visual studio(注意没有code,是完整的IDE)开发python和c++,那么按下面的文档操作肯定可以成功(虽然文档中有些内容可能跟你所使用的VS版本有些差异,但稍微摸索一下肯定能解决):

编写 Python 的 C++ 扩展 - Visual Studio (Windows) | Microsoft Learn

但是,如果不想安装visual studio(规模实在有点太大),或者仅仅是不能忍受微软官方文档的拖沓风格,就可以参阅本文。

【补充说明】如果不想了解有关编写CMakelists.txt文件的信息,可直接参阅简明使用pybind11开发pythonc++扩展模块教程-优快云博客进行开发,不必继续阅读本文。

第一部分:pybind11安装

开发python的c++扩展模块可以使用的工具有很多,根据AI的回答,最推荐的是pybind11,实际上,pybind11确实是需要添加的模板代码最少、对c++文件的修改最为容易的。要使用pybind11,首先就是要安装它。安装有全局安装和作为项目的子模块安装两类。

全局安装方面,有两种方法:

1、pip install pybind11

2、手动下载并配置 pybind11:

2.1、下载 pybind11 的源代码:

git clone https://github.com/pybind/pybind11.git

2.2、创建构建目录并进入:

cd pybind11
mkdir build
cd build

2.3配置和安装 pybind11:

cmake -DPYBIND11_TEST=OFF ..
cmake --build . --config Release --target install

构建过程中,如果没有安装VS,那么可能出现nmake方面的错误,这时只需要将2.3的第一个命令加上-G "MinGW Makefiles"选项,使用mingw32-make来构建(当然,这需要先下载并解压mingw工具,并将其bin目录加入path环境变量以方便实用,github有mingw64项目的托管网址),即改成(注意命令行末尾的点,两个表示上级目录,因为现在已经进入了build目录,执行这条命令生成makefile需要到上级目录找pybind11的CMakeLists.txt。执行这条命令生成的makefile则在build目录中,所以上面2.3的第二条命令的--build选项下就只有一个点了,表示在当前目录下查找makefile):

cmake -G "MinGW Makefiles" -DPYBIND11_TEST=OFF ..

将pybind11作为自己项目的子模块安装,需要在项目工作目录下执行以下命令:

git init
git submodule add https://github.com/pybind/pybind11.git

然后在工作目录下的CMakeLists.txt文件中添加:

add_subdirectory(pybind11)

上面的安装方式各有优劣,其中手动安装方式往往可以在配置文件没有明确指定pybind11依赖路径时也能成功编译。

第二部分:编写扩展模块的c++代码

接下来可以准备c++扩展模块的代码编写了。pybind11中的“11”的意思,是c++标准c++11,所以c++代码最好用符合c++11标准的语法及数据类型等。我已经几十年不用c++写代码了,读还勉强,写就效率很低甚至根本写不出来,怎么办?没关系,现在有AI,我对AI说:

请生成一个c++类,让它具有以下方法:
1、方法 1:读取一个csv文件,将文件第一行数据当做列标题,第一列当做行标题,用第二行开始的所有数据构建一个map并返回;
2、方法 2:按行标题和列标题查找数据,并返回查到的数据;
3、方法 3:根据行标题返回一行数据(不包括行标题);
4、方法 4:根据列标题返回一列数据;
5、方法 5:返回列标题。
将以上方法公开到pybind11中并导出。

然后AI就给我生成了一个c++文件,之后我又有新的想法向AI提出并由AI给出代码修改,我按后面介绍的编译步骤进行编译,并根据错误提示(错误很少)对c++文件进行修改,最后形成了如下结果:

#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <pybind11/complex.h>
#include <pybind11/functional.h>
#include <pybind11/chrono.h>
#include &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yivifu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值