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

VisualStudio配置pybind11-Python调用C++方法

        个人测试下来Debug生成的dll改pyd,py中import会报错gilstate->autoInterpreterState

        如果遇到同样问题使用Release吧


目录

1.安装pybind11

        1.pip:

        2.github:

2.配置VS工程

        2.在VC目录中的包含目录添加:

        3.在VC目录中的库目录添加:

        4.在链接器-输入-添加依赖项中添加:

3.生成dll

4.快捷更新

        1.创建新的启动项目

        2.添加引用

        3.编写dll2pyd


1.安装pybind11

        pybind11是一个简化python调用c++的库,其使用了许多c++11特性来简化流程

        安装pybind有许多方式,以下列举两种:

        1.pip:

                使用pip install pybind11,便可以直接安装pybind11。

                对应安装目录在Python目录的Lib文件夹下的site-packages文件夹下的pybind11文件夹。

        2.github:

                直接去github官方页面下载,解压到你想安装的位置

                官方链接:https://github.com/pybind/pybind11

2.配置VS工程

        vs版本需要在2017及以上

        1.将配置类型(输出)改成dll

        2.在VC目录中的包含目录添加:

                1.pybind安装目录下的include文件夹

                2.Python文件夹中的include文件夹

        3.在VC目录中的库目录添加:

                Python文件夹中的libs文件夹

        4.在链接器-输入-添加依赖项中添加:

                对应的lib文件

                比如我是Python39,在Python文件夹的libs文件夹中有:

                        1.python3.lib

                        2.python3_d.lib

                        3.python39.lib

                        4.python39_d.lib

                所以在配置为Debug时添加带有后缀_d的lib(上面的2与4)

                Release中添加不带_d的(1与3)

                但其中python3与python3_d.lib好像也可以不用添加

3.生成dll

        可以使用官方的代码先做个测试

        想学更多的可以看官方文档(英文):First steps - pybind11 documentation

#include <pybind11/pybind11.h>int add(int i, int j) {return i + j;
}PYBIND11_MODULE(example, m) {m.doc() = "pybind11 example plugin"; // optional module docstringm.def("add", &add, "A function that adds two numbers");
}

        注意其中PYBIND11_MODULE中第一个参数为你取module的名字

        需要与最终生成的dll文件名字(vs默认是工程名字)(你也可以生成了文件,后改文件名)

        py中import的名字一致

        最终将你生成的dll后缀名改为.pyd放入你python工程中或者和你运行py的文件目录同级,然后import进行使用

$ python
Python 3.9.10 (main, Jan 15 2022, 11:48:04)
[Clang 13.0.0 (clang-1300.0.29.3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import example
>>> example.add(1, 2)
3
>>>

4.快捷更新

        如果每次生成dll,我们都要到对应的目录找到dll后改名再放入py目录中就太麻烦了

        这时我们可以使用vs多项目间的引用功能

        1.创建新的启动项目

        在同解决方案内创建一个新的控制台项目

        红框内是上述配置好用于生成dll的项目(MyCPPLib)

        而dll2pyd这个项目是用于新创建的自动更新的控制台项目

        

        创建好后,将项目的启动项目设置为dll2pyd

        2.添加引用

        在dll2pyd中的引用里添加MyCPPLib

        

        那么添加后,只要点击调试,vs就会运行我们dll2pyd的代码

        而dll2pyd引用了MyCPPLib,故如MyCPPLib需要更新,则会在运行dll2pyd前自动更新

     

        3.编写dll2pyd

        那么显然此时我们只需要在dll2pyd的main函数实现

        能够让生成dll自动覆盖目标位置pyd的代码即可

        此时我们便可以更改MyCPPLib文件的源码

        然后直接点击调试运行便可以直接在Pycharm(或者其他py)中看到效果

        以下是我的一个简单实现:

        读取MyCPPLib(解决方案名字)/dll2pyd(项目名字)/config.ini配置文件

#include <fstream>
#include <iostream>
using namespace std;
string source;
string target;void read_ini()
{ifstream fs("config.ini", ios_base::in);string temp;fs >> temp;fs >> source;fs >> temp;fs >> target;fs.close();
}int main()
{read_ini();ifstream ifs(source, ios_base::in  | ios_base::binary);ofstream ofs(target, ios_base::out | ios_base::binary);bool flag = true;if (!ifs.is_open())cout << "open source[" << source << "] failed" << endl, flag = false;if (!ofs.is_open())cout << "open target[" << target << "] failed" << endl, flag = false;if (flag)ofs << ifs.rdbuf();ifs.close();ofs.close();return 0;
}

相关文章:

VisualStudio配置pybind11-Python调用C++方法

个人测试下来Debug生成的dll改pyd&#xff0c;py中import会报错gilstate->autoInterpreterState 如果遇到同样问题使用Release吧 目录 1.安装pybind11 1.pip&#xff1a; 2.github&#xff1a; 2.配置VS工程 2.在VC目录中的包含目录添加&#xff1a; 3.在VC目录中的库目录…...

ZZULIOJ 1164: 字符串加密,Java

ZZULIOJ 1164: 字符串加密&#xff0c;Java 题目描述 输入一串字符&#xff08;长度不超过100&#xff09;和一个正整数k&#xff0c;将其中的英文字母加密并输出加密后的字符串&#xff0c;非英文字母不变。加密思想&#xff1a;将每个字母c加一个序数k&#xff0c;即用它后…...

联合体(共用体)的简单介绍

目录 概念&#xff1a; 联合的声明&#xff1a; 类比结构体&#xff1a; 联合体的大小&#xff1a; 联合的⼤⼩⾄少是最⼤成员的⼤⼩ 联合体的空间是共用的 联合体内部成员的赋值&#xff1a; 当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候&#xff0c;就要对⻬到最⼤对⻬…...

Ansible学习笔记8

group模块&#xff1a; 创建一个group组&#xff1a; [rootlocalhost ~]# ansible group1 -m group -a "nameaaa gid5000" 192.168.17.105 | CHANGED > {"ansible_facts": {"discovered_interpreter_python": "/usr/bin/python"}…...

五子棋游戏禁手算法的改进

五子棋游戏禁手算法的改进 五子棋最新的禁手规则&#xff1a; 1&#xff0e;黑棋禁手判负、白棋无禁手。黑棋禁手有“三三”&#xff08;包括“四三三”&#xff09;、“四四”&#xff08;包括“四四三”&#xff09;和“长连”。黑棋只能以“四三”取胜。 2&#xff0e;黑方…...

基于 Debian 12 的 Devuan GNU+Linux 5 为软件自由爱好者而生

导读Devuan 开发人员宣布发布 Devuan GNULinux 5.0 “代达罗斯 “发行版&#xff0c;它是 Debian GNU/Linux 操作系统的 100% 衍生版本&#xff0c;不包含 systemd 和相关组件。 Devuan GNULinux 5 基于最新的 Debian GNU/Linux 12 “书虫 “操作系统系列&#xff0c;采用长期支…...

算法系列-力扣234-回文链表判定

回文链表判定 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 方法一&#xff1a;栈反转对比法 解题思路&#xff1a;找到中间节点后用栈辅助反转对比 解题方法&#xff1…...

算法通关村——海量数据场景下的热门算法题的处理方法

1. 从40个亿中产生一个不存在的整数 题目要求&#xff1a;给定一个输入文件&#xff0c;包含40亿个非负整数&#xff0c;请设计一个算法&#xff0c;产生一个不存在该文件中的整数&#xff0c;假设你有1GB的内存来完成这项任务。 ● 进阶&#xff1a;如果只有10MB的内存可用&a…...

【C++从0到王者】第二十五站:多继承的虚表

文章目录 前言一、多继承的虚函数表二、菱形继承与菱形虚拟继承的虚函数表1.菱形继承2.菱形虚拟继承的虚函数表 三、抽象类1.抽象类的概念2.接口继承与实现继承 总结 前言 其实关于单继承的虚函数表我们在上一篇文章中已经说过了&#xff0c;就是派生类中的虚表相当于拷贝了一…...

老程序员教你如何笑对问题,轻松培养逻辑思考和解决问题的能力

原文链接 ​​​​​​​老程序员教你如何笑对问题&#xff0c;轻松培养逻辑思考和解决问题的能力 故事发生在一个阳光明媚的午后&#xff0c;我们的主人公&#xff0c;老李&#xff0c;一位拥有十年工作经验的 Python 老程序员&#xff0c;正悠哉地在喝着咖啡。 这时&#x…...

Omni Recover for Mac(专业的iPhone数据恢复软件)

Omni Recover for Mac是一款专业的Mac数据恢复软件&#xff0c;能够帮助用户快速找回被误删除、格式化、病毒攻击等原因造成的文件和数据&#xff0c;包括图片、视频、音频、文档、邮件、应用程序等。同时&#xff0c;Omni Recover for Mac还具有数据备份和清理功能&#xff0c…...

视频垂直镜像播放,为您的影片带来新鲜感

大家好&#xff01;在制作视频时&#xff0c;我们常常希望能够给观众带来一些新鲜感和独特的视觉效果。而垂直镜像播放是一个能够让您的影片与众不同的技巧。然而&#xff0c;传统的视频剪辑软件往往无法直接实现视频的垂直镜像播放&#xff0c;给我们带来了一些困扰。现在&…...

十一、MySQL(DQL)聚合函数

1、聚合函数 注意&#xff1a;在使用聚合函数时&#xff0c;所有的NULL是不参与运算的。 2、实际操作&#xff1a; &#xff08;1&#xff09;初始化表格 &#xff08;2&#xff09;统计该列数据的个数 基础语法&#xff1a; select count(字段名) from 表名; &#xff1b;统…...

C语言:三子棋小游戏

简介&#xff1a; 目标很简单&#xff1a;实现一个 三子棋小游戏。三子棋大家都玩过&#xff0c;规则就不提及了。本博文中实现的三子棋在对局中&#xff0c;电脑落子是随机的&#xff0c;不具有智能性&#xff0c;玩家的落子位置使用键盘输入坐标。下面开始详细介绍如何实现一…...

JAVA - PO DTO 生成器

PO DTO 生成器 假设你是一个Java 高级程序员&#xff0c;我会提供一些信息&#xff0c;你需要帮我自动生成Java的PO、DTO 对象。 这些信息有着固定的形式&#xff0c;第一行是对象的类名&#xff0c;其后的每一行都是该对象的属性(简称“属性”)。 对于我属性&#xff0c;格式…...

tcpdump

TCPDump是一个用于抓取网络数据包的命令行工具。它可以帮助网络管理员和开发人员分析网络流量、故障排除以及安全问题。下面是一些TCPDump的详细用法&#xff1a; 基本用法&#xff1a; 监听指定网络接口&#xff1a;tcpdump -i eth0通过IP地址过滤&#xff1a;tcpdump host 19…...

数据通信——传输层TCP(可靠传输原理的ARQ)

引言 上一篇讲述了停止等待协议的工作流程&#xff0c;在最后提到了ARQ自动请求重传机制。接下来&#xff0c;我们就接着上一篇的篇幅&#xff0c;讲一下ARQ这个机制 还是这个图来镇楼 ARQ是什么&#xff1f; 发送端对出错的数据帧进行重传是自动进行的&#xff0c;因而这种…...

Compose - 交互组合项

按钮 Button OutLinedButton带外边框、TextButton只是文字、IconButton只是图标形状。 Button(onClick { }, //点击回调modifier Modifier,enabled true, //启用或禁用interactionSource MutableInteractionSource(),elevation ButtonDefaults.elevatedButtonElevation( /…...

【发版公告】Virbox Protector 3.1.3.19051 发版- elf 文件支持导入表保护

深盾安全-软件保护工具 Virbox Protector 3 &#xff08; 3.1.3.19051&#xff09;迎来了版本升级.本次升级支持了 elf 文件导入表保护。 以下是本次 Virbox Protector 发版的主要功能&#xff1a; 新功能 1. ELF格式的程序支持导入表保护(Beta)&#xff1b;&#xff1b; 2…...

点云数据做简单的平面的分割 三维场景中有平面,杯子,和其他物体 实现欧式聚类提取 对三维点云组成的场景进行分割

点云分割是根据空间,几何和纹理等特征对点云进行划分,使得同一划分内的点云拥有相似的特征,点云的有效分割往往是许多应用的前提,例如逆向工作,CAD领域对零件的不同扫描表面进行分割,然后才能更好的进行空洞修复曲面重建,特征描述和提取,进而进行基于3D内容的检索,组合…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...

加密通信 + 行为分析:运营商行业安全防御体系重构

在数字经济蓬勃发展的时代&#xff0c;运营商作为信息通信网络的核心枢纽&#xff0c;承载着海量用户数据与关键业务传输&#xff0c;其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级&#xff0c;传统安全防护体系逐渐暴露出局限性&a…...