当前位置: 首页 > news >正文

使用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(规模实在有点太大),或者仅仅是不能忍受微软官方文档的拖沓风格,就可以参阅本文。

【补充说明】这篇文章是我自己学习过程的记录,文章发完后我试了一下,只做第二部分和第五部分居然就能够生成可以移植到任意python项目中使用的c++扩展模块了。当然,这有可能是因为我的电脑上已经做过全过程操作使得第一三四部分在开发类似项目的时候可以免除了。各位在参阅此文进行操作的时候可以先试试只做第二部分与第五部分,看能不能够成功。我猜测只要装了VS(安装过程中它会自动配置好编译链接工具),应该就只需要第二部分和第五部分即可,写完c++模块就可以直接构建分发了。

第一部分: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++文件,我按后面介绍的编译步骤进行编译,并根据错误提示(错误很少)对c++文件进行修改,之后形成了如下结果:

#include <pybind11/pybind11.h>
#include <pybind11/st

相关文章:

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

在做紫微斗数程序的时候用到了padas库,不过也只用了它下面几个功能: 1、读入csv文件,构造DataFrame; 2、通过行列标题查找数据; 3、通过行标题读取一行数据。 用这几个功能却导入了pandas、numpy、dateutil、pytz等一堆库,多少有点划不来,于是想用c++开发一个实现这几…...

系统与网络安全------网络通信原理(5)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 传输层解析 传输层 传输层的作用 IP层提供点到点的连接传输层提供端到端的连接 端口到端口的连接&#xff08;不同端口号&#xff0c;代表不同的应用程序&#xff09; TCP协议概述 TCP&#xff08;Transm…...

JavaScript防抖与节流

目录 防抖&#xff08;Debounce&#xff09; 一、防抖的定义 二、防抖的实现原理 三、防抖的代码实现 四、代码解析 五、使用示例 1. 输入框实时搜索&#xff08;延迟执行模式&#xff09; 2. 按钮防重复点击&#xff08;立即执行模式&#xff09; 六、总结 节流&…...

Java网络编程实战(多人聊天室-CS模式)

一、C/S模式核心原理 1.1 基本架构 C/S&#xff08;Client/Server&#xff09;模式采用客户端-服务器架构&#xff1a; 服务器端&#xff1a;持续运行&#xff0c;负责消息路由和广播客户端&#xff1a;用户交互界面&#xff0c;连接服务器进行通信通信协议&#xff1a;TCP&…...

Vue3.5 + Vite6.x 项目的完整 Stylelint 配置方案,支持 .vue/.html 内联样式、Less/SCSS/CSS 等多种文件类

Vue3.5 Vite6.x 项目的完整 Stylelint 配置方案&#xff0c;支持 .vue/.html 内联样式、Less/SCSS/CSS 等多种文件类型 一、完整依赖安装 npm install --save-dev stylelint stylelint-config-standard postcss-html # 解析 Vue/HTML 文件中的样式postcss-scss …...

23种设计模式Java版(带脑图,带示例源码)

设计模式 1、创建型 1.1、单例模式(Singleton pattern) 确保一个类只有一个实例&#xff0c;并提供该实例的全局访问点。 1.2、工厂方法(Factory Method) 它定义了一个创建对象的接口&#xff0c;但由子类决定要实例化哪个类。工厂方法把实例化操作推迟到子类。 1.3、抽象…...

mapbox高阶,使用graphology、graphology-shortest-path前端插件和本地geojson数据纯前端实现路径规划

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️graphology 插件1.3.1 ☘️概念1.3.2 ☘…...

【已解决】vscode升级后连接远程异常:“远程主机可能不符合XXX的先决条件”解决方法

vscode提示升级&#xff0c;每次都升了&#xff0c;突然某次关闭后无法连接远程&#xff0c;查询资料是因为从VS Code 1.86.1版本开始&#xff08;2024年1月&#xff09;要求glibc版本>2.28。 命令“ ldd --version”可查看glibc版本为2.27&#xff1a; rootXXXXXXX:~$ ld…...

Springboot整合JAVAFX

Springboot整合JAVAFX 实体与VO设计 pom.xml文件如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xs…...

【算法】——一键解决动态规划

前言 动态规划是一种高效解决​​重叠子问题​​和​​最优子结构​​问题的算法思想。它通过​​分治记忆化​​&#xff0c;将复杂问题分解为子问题&#xff0c;并存储中间结果&#xff0c;避免重复计算&#xff0c;从而大幅提升效率。 ​​为什么重要&#xff1f;​ ​​优化…...

Git使用与管理

一.基本操作 1.创建本地仓库 在对应文件目录下进行&#xff1a; git init 输入完上面的代码&#xff0c;所在文件目录下就会多一个名为 .git 的隐藏文件&#xff0c;该文件是Git用来跟踪和管理仓库的。 我们可以使用 tree 命令&#xff08;注意要先下载tree插件&#xff09…...

npm、nvm、nrm

NVM (Node Version Manager) 常见指令 NVM 是一个用于管理 Node.js 版本的流行工具&#xff0c;允许你在同一台机器上安装和切换不同版本的 Node.js。以下是 NVM 的常见指令&#xff1a; 安装与卸载 nvm install <version> - 安装指定版本的 Node.js 例如&#xff1a;…...

Java 文件内容转换为MD5哈希值

若要把读取到的 files 列表里的内容转换为 MD5 哈希值&#xff0c;你可以逐个遍历 files 列表中的元素&#xff0c;将每个元素的内容计算成 MD5 哈希值。 以下是一个完整的 Java 示例代码&#xff0c;展示了如何实现这一功能&#xff1a; import java.io.BufferedInputStream…...

未来郴州:科技与自然的交响诗篇

故事背景 故事发生在中国湖南郴州&#xff0c;描绘了未来城市中科技与自然共生共荣的奇妙图景。通过六个充满诗意的场景&#xff0c;展现雾能转化系统、立体生态书库、智能稻田等创新设计&#xff0c;编织出一曲人类智慧与自然韵律共鸣的未来交响。 故事内容 在东江湖的晨雾中&…...

UE5 运行时动态将玩家手部模型设置为相机的子物体

在编辑器里&#xff0c;我们虽然可以手动添加相机&#xff0c;但是无法将网格体设置为相机的子物体&#xff0c;只能将相机设置为网格体的子物体 但是为了使用方便&#xff0c;我们希望将网格体设置为相机的子物体&#xff0c;这样我们直接旋转相机就可以旋转网格体&#xff0…...

Ubuntu系统下的包管理器APT

Ubuntu系统下的包管理器APT 在Linux操作系统生态中&#xff0c;软件包管理工具是连接用户与系统功能的桥梁。Ubuntu作为基于Debian的流行发行版&#xff0c;其强大的包管理系统APT&#xff08;Advanced Packaging Tool&#xff09;为开发者与系统管理员提供了便捷的软件生命周…...

超级码科技发布镂空AI保险胶带,重塑包装防伪新标准

在酒类、物流、奢侈品、电子产品等领域&#xff0c;包装安全与防伪需求日益迫切。传统封箱胶带易被转移或重复利用&#xff0c;导致商品被仿冒的风险居高不下。 为此&#xff0c;超级码科技推出镂空型防揭AI数字身份保险封箱胶带——一款集结构防伪、信息追踪与增值服务于一体的…...

微软Exchange管理中心全球范围宕机

微软已确认Exchange管理中心&#xff08;Exchange Admin Center&#xff0c;EAC&#xff09;发生全球性服务中断&#xff0c;导致管理员无法访问关键管理工具。该故障被标记为关键服务事件&#xff08;编号EX1051697&#xff09;&#xff0c;对依赖Exchange Online的企业造成广…...

前端通信库fetch-event-source实现丰富的SSE

环境:SpringBoot3.4.0 + Vue3 1. 简介 SSE(Server-Sent Events)是一种基于HTTP的服务器向客户端单向推送实时数据的轻量级协议,配合浏览器原生EventSource API,可实现高效实时通信。前端通过创建EventSource对象订阅服务端流,自动处理连接、重试与数据解析;服务端设置C…...

JVM 中Minor GC、Major GC、Full GC 的区别?

Minor GC、Major GC 和 Full GC 是 Java 虚拟机 (JVM) 垃圾回收 (Garbage Collection) 中的不同类型的 GC 事件&#xff0c;它们在范围、触发条件、停顿时间等方面有所不同。 1. Minor GC (Young GC): 范围&#xff1a; 只针对新生代 (Young Generation) 进行垃圾回收。触发条…...

2747. 统计没有收到请求的服务器数目

文章目录 题意思路代码 题意 题目链接 思路 代码 class Solution { public:vector<int> countServers(int n, vector<vector<int>>& logs, int x, vector<int>& queries) {sort(logs.begin(), logs.end(), [](vector<int> &a, v…...

设计模式:抽象工厂 - 掌控多产品族的创建之道

一、什么是抽象工厂模式&#xff1f; 抽象工厂模式是一种创建型设计模式&#xff0c;提供一个接口&#xff0c;用于创建一系列相关或相互依赖的对象&#xff0c;而无需指定它们的具体类。 核心思想 1.定义多个产品的抽象接口&#xff0c;统一管理具体产品和工厂的创建逻辑。…...

图神经网络+多模态:视频动作分割的轻量高效新解法

一、引言 在智能监控、自动驾驶、人机交互等领域&#xff0c;准确理解视频中的动作序列至关重要。然而&#xff0c;传统方法依赖复杂的视觉模型&#xff0c;计算成本高且难以捕捉长时依赖。近期&#xff0c;一项名为 Semantic2Graph 的研究通过图神经网络&#xff08;GNN&am…...

技术与情感交织的一生 (五)

目录 初入“江湖” 分工 陌生 CraneOffice 内功 宝典 枪手 回到大二 通关 小聚 唱一首歌 初入“江湖” 分工 软件工作室是坐落在和平区宜昌道的一间民房&#xff0c;和我想象中的公司形象多少有些偏差。天津的道路有点凌乱&#xff0c;初次的时候不太好找&#xf…...

简单-快速-高效——模块化解析Pulid(实现不同风格下的人脸一致)

资源 论文&#xff1a;https://arxiv.org/abs/2404.16022 github&#xff1a;https://github.com/ToTheBeginning/PuLID?tabreadme-ov-file comfyui插件&#xff1a;https://github.com/sipie800/ComfyUI-PuLID-Flux-Enhanced 讲解参考 https://zhuanlan.zhihu.com/p/69684…...

XYZ to xyY 求解

免责声明&#xff1a;本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下&#xff0c;作者不对因使用本文内容而导致的任何直接或间接损失承担责任&#xff0c;包括但不限于数据丢失、业务中断或其他经济…...

科技自然的协奏曲-深圳

故事背景 故事发生在中国广东深圳的现代城市环境&#xff0c;这里呈现出未来科技与自然生态共生的独特图景。没有具体的角色&#xff0c;却通过多样的场景描绘&#xff0c;展现出未来生活的活力与创新&#xff0c;反映出社会创新与人类情感的紧密结合。 故事内容 在未来的深…...

idea 创建 maven-scala项目

文章目录 idea 创建 maven-scala项目1、创建普通maven项目并且配置pom.xml文件2、修改项目结构1&#xff09;创建scala目录并标记成【源目录】2&#xff09;导入scala环境3&#xff09;测试环境 idea 创建 maven-scala项目 1、创建普通maven项目并且配置pom.xml文件 maven依赖…...

C++项目:高并发内存池_下

目录 8. thread cache回收内存 9. central cache回收内存 10. page cache回收内存 11. 大于256KB的内存申请和释放 11.1 申请 11.2 释放 12. 使用定长内存池脱离使用new 13. 释放对象时优化成不传对象大小 14. 多线程环境下对比malloc测试 15. 调试和复杂问题的调试技…...

【UE5】RTS游戏的框选功能+行军线效果实现

目录 效果 步骤 一、项目准备 二、框选NPC并移动到指定地点 三、框选效果 四、行军线效果 效果 步骤 一、项目准备 1. 新建一个俯视角游戏工程 2. 新建一个pawn、玩家控制器和游戏模式,这里分别命名为“MyPawn”、“MyController”和“MyGameMode” 3. 打开“MyGam…...

多图超详细:Docker安装知识库AI客服RAGFlow的详细步骤、使用教程及注意事项:

RAGFlow 介绍 RAGFlow 是一款基于深度文档理解的开源检索增强生成&#xff08;RAG&#xff09;引擎&#xff0c;通过结合信息检索与生成式 AI 技术&#xff0c;解决复杂场景下的数据处理和可信问答问题。其核心设计目标是提供透明化、可控化的文档处理流程&#xff0c;并通过多…...

docker compose安装智能体平台N8N

使用 docker volume create n8n_data 创建了一个名为 n8n_data 的数据卷。你通过 docker run 启动容器&#xff0c;映射了端口 5678&#xff0c;并挂载了 n8n_data 数据卷。 以下是对应的 docker-compose.yml 配置文件&#xff1a; version: "3.7"services:n8n:ima…...

FRP调用本地摄像头完成远程拍照

from flask import Flask, Response import cv2app Flask(__name__)# 基础文字回复 app.route(/) def hello_world():return <h1>你好啊世界</h1><img src"/camera" width"640" /># 摄像头拍照并返回图像 app.route(/camera) def captu…...

【Linux】39.一个基础的HTTP Web服务器

文章目录 1. 实现一个基础的HTTP Web服务器1.1 功能实现&#xff1a;1.2 Log.hpp-日志记录器1.3 HttpServer.hpp-网页服务器1.4 Socket.hpp-网络通信器1.5 HttpServer.cc-服务器启动器 1. 实现一个基础的HTTP Web服务器 1.1 功能实现&#xff1a; 总体功能&#xff1a; 提供We…...

蓝桥杯-小明的背包(动态规划-Java)

0/1背包问题介绍 0/1背包问题是经典的动态规划问题&#xff0c;具体描述如下&#xff1a; 解题思路&#xff1a; 输入数据 首先&#xff0c;程序通过 Scanner 从输入中读取数据&#xff1a; n 表示物品的数量。 v 表示背包的最大容量。 接着读取每个物品的重量和价值&#xff…...

(四十一)Dart 中的空安全与 `late` 关键字教程

Dart 中的空安全与 late 关键字教程 空安全简介 空安全&#xff08;Null Safety&#xff09;是 Dart 语言的一项重要特性&#xff0c;旨在帮助开发者避免空指针异常&#xff08;NullPointerException&#xff09;。空安全通过在编译时检查变量是否可能为 null&#xff0c;从而…...

GaussDB使用指南

目录 1. GaussDB 概述 1.1 GaussDB 简介 1.2 核心技术架构 1.3 适用场景与行业案例 2. GaussDB 安装与部署 2.1 环境准备与依赖检查 2.2 单机版安装&#xff08;Linux&#xff09; 2.3 分布式集群部署 3. GaussDB 基础操作与语法 3.1 数据库连接与用户管理 3.2 DDL …...

算法训练之动态规划(一)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...

dubbo配置中心

配置中心 简介 配置中心&#xff08;config-center&#xff09;在dubbo中可承担两类职责&#xff1a; 外部化配置&#xff1a;启动配置的集中式存储。流量治理规则存储。 Dubbo动态配置中心定义了两个不同层次的隔离选项&#xff0c;分别是namespace和group。 namespace&a…...

移动端六大语言速记:第11部分 - 内存管理

移动端六大语言速记&#xff1a;第11部分 - 内存管理 本文将对比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift这六种移动端开发语言在内存管理方面的特性&#xff0c;帮助开发者理解和掌握各语言的内存管理机制。 11. 内存管理 11.1 垃圾回收机制对比 各语言垃圾回收…...

对象的创建方式有哪些?在虚拟机中具体的创建过程是怎样的?

在Java中&#xff0c;对象的创建方式及其在虚拟机中的具体过程如下&#xff1a; 一、对象的创建方式 使用 new 关键字 最常见的对象创建方式&#xff0c;直接调用类的构造方法。 MyClass obj new MyClass();反射&#xff08;Reflection&#xff09; 通过 Class 或 Constructor…...

openwrt软路由配置3

1.启用sftp文件连接 使用ssh连接openwrt时&#xff0c;我发现无法打开sftp windows进行上传和下载文件&#xff0c;提示 sftp channel closed by server: stderr:ash /usr/libexec/sftp-server:not found 原因是系统刚刚装好后&#xff0c;没有安装openssh-sftp-server包 opk…...

C语言for循环嵌套if相关题目

一、题目引入 以下代码程序运行结果是多少? 二、思路解析 进入一个for循环 a<100 进入第一个if b1不大于20为假 进入第二个if b4 a这时a自增为2 当b4时,满足第二个if条件 1.b4,a2 当b7时,满足第二个if条件 2.bb37,a3 当b10时,满足第二个if条件 …...

Redis与Mysql双写一致性如何保证?

我们在面试的时候redis与mysql双写一致性是一个常考的问题&#xff0c;今天我们就一起探讨一下吧 所谓的一致性就是数据的一致性&#xff0c;在分布式系统中&#xff0c;可以理解为多个节点中数据的值是一致的。 强一致性&#xff1a; 这种一致性级别是最符合用户直觉的&…...

STM32 CRC校验与芯片ID应用全解析:从原理到实践 | 零基础入门STM32第九十七步

主题内容教学目的/扩展视频CRC与芯片ID原理实现CRC校验和读取芯片ID为单片机应用提供数据验证和身份识别的功能。 师从洋桃电子&#xff0c;杜洋老师 &#x1f4d1;文章目录 一、CRC校验功能解析1.1 CRC基本原理1.2 核心功能对比 二、CRC校验应用实战2.1 典型应用场景2.2 程序实…...

《微服务与事件驱动架构》读书分享

《微服务与事件驱动架构》读书分享 Building Event-Driver Microservices 英文原版由 OReilly Media, Inc. 出版&#xff0c;2020 作者&#xff1a;[加] 亚当 • 贝勒马尔 译者&#xff1a;温正东 作者简介&#xff1a; 这本书由亚当贝勒马尔&#xff08;Adam Bellemare…...

⼤模型(LLMs)基础

⼤模型&#xff08;LLMs&#xff09;基础 ⽬前 主流的开源模型体系 有哪些&#xff1f;prefix Decoder 和 causal Decoder 和 Encoder-Decoder 区别是什么&#xff1f;⼤模型LLM的 训练⽬标 是什么&#xff1f;涌现能⼒是啥原因&#xff1f;为何现在的⼤模型⼤部分是Decoder o…...

IDEA :物联网ThingsBoard-gateway配置,运行Python版本,连接thingsboard,接入 MQTT 设备

准备阶段&#xff08;教程只针对本地操作&#xff0c;未涉及虚拟机环境&#xff09; Thingsboard源码编译并运行 没有操作过的小伙伴&#xff0c;可以看我上一篇文章 物联网ThingsBoard源码本地编译篇&#xff0c;超详细教程&#xff0c;小白看过来&#xff01;_thingsboard…...

面向大模型的开发框架LangChain

这篇文章会带给你 如何使用 LangChain&#xff1a;一套在大模型能力上封装的工具框架如何用几行代码实现一个复杂的 AI 应用面向大模型的流程开发的过程抽象 文章目录 这篇文章会带给你写在前面LangChain 的核心组件文档&#xff08;以 Python 版为例&#xff09;模型 I/O 封装…...

每日算法:洛谷U535992 J-C 小梦的宝石收集(双指针、二分)

题目描述 小梦有 n 颗能量宝石&#xff0c;其中第 i 颗的能量为 ai​&#xff0c;但这些能量宝石十分不稳定&#xff0c;随时有可能发生崩坏&#xff0c;导致他们全部消失&#xff01; 小梦想要留住宝石们&#xff0c;不希望他们发生崩坏&#xff0c;同时他发现&#xff1a;如…...