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

news2024/11/23 12:19:27

        个人测试下来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 docstring

    m.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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/964494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Debezium的三种部署方式

Debezium如何部署 debezium 有下面三种部署方式,其中最常用的就是 kafka connect。 kafka connect 一般情况下,我们通过 kafka connect 来部署 debezium,kafka connect 是一个框架和运行时: source connectors:像 debezium 这样将记录发送到 kafka 的source connectors…

JavaScript基础语法04——输入输出语法

嗨&#xff0c;大家好&#xff0c;我是雷工。 今天学习JavaScript基础语法&#xff0c;输入输出语法&#xff0c;以下为学习笔记。 1、输出语法&#xff1a; 1.1、alert&#xff08;&#xff09; 作用&#xff1a;界面弹出警告对话框。 示例&#xff1a; <script>aler…

数据结构入门 — 队列

本文属于数据结构专栏文章&#xff0c;适合数据结构入门者学习&#xff0c;涵盖数据结构基础的知识和内容体系&#xff0c;文章在介绍数据结构时会配合上动图演示&#xff0c;方便初学者在学习数据结构时理解和学习&#xff0c;了解数据结构系列专栏点击下方链接。 博客主页&am…

Linux centos7 bash编程(循环与条件判断)

在编程训练中&#xff0c;循环结构与条件判断十分重要。 根据条件为真为假确定是否执行循环。 有时&#xff0c;根据条件的真假结果&#xff0c;决定执行哪些语句&#xff0c;这就是分支语句。 为了训练分支语句与循环语句&#xff0c;我们设计一个案例&#xff1a; 求一组…

Python库-coverage测试覆盖率

Coverage.py 是用于测量Python程序代码覆盖率的工具。它 监视程序&#xff0c;注意代码的哪些部分已执行&#xff0c;然后 分析源以识别可以执行但未执行的代码。 覆盖率测量通常用于衡量测试的有效性。它 可以显示测试正在执行代码的哪些部分&#xff0c;以及哪些部分是 不。…

CentOS配置Java环境报错-bash: /usr/local/jdk1.8.0_381/bin/java: 无法执行二进制文件

CentOS配置Java环境后执行java -version时报错&#xff1a; -bash: /usr/local/jdk1.8.0_381/bin/java: 无法执行二进制文件原因是所使用的jdk的版本和Linux内核架构匹配不上 使用以下命令查看Linux架构&#xff1a; [rootlocalhost ~]# cat /proc/version Linux version 3.1…

C语言:大小端字节序存储

一、大小端字节序存储介绍 大端字节序存储模式&#xff1a;把一个数据低位字节处的数据存放在高地址处&#xff0c;数据高位字节处的数据存放在低地址处 小端字节序存储模式&#xff1a;把一个数据低位字节处的数据存放在低地址处&#xff0c;数据高位字节处的数据存放在高地址…

经管博士科研基础【12】包络定理

当我们知道一个函数的最优解时&#xff0c;我们要求解这一个函数的值函数关于函数中某一个参数的导数&#xff0c;那么就可以使用包络定理。 1. 无约束条件下的包络定理 函数在其极值点处对一个参数&#xff08;参数不是自变量&#xff09;取偏导数的结果&#xff0c;等价于这…

5G NR:RACH流程 -- Msg1发送时RA-RNTI的计算及功率控制

前言 如果阅读了这两篇博文《如何产生PRACH preamble》和《如何选择合适的时频资源发送preamble》&#xff0c;那么对msg1有了基本了解&#xff0c;但是真到了Msg1发送的时候&#xff0c;该怎么处理呢&#xff0c;这里涉及到两个问题&#xff1a; 问题1&#xff1a;发…

5、Spring之Bean生命周期源码解析(销毁)

Bean的销毁过程 Bean销毁是发送在Spring容器关闭过程中的。 在Spring容器关闭时,比如: AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); UserService userService = (UserService) context.getBean("userSe…

【CLIP详读】

个人网站&#xff1a;https://tianfeng.space 一、前言 OpenAI的CLIP项目自从推出以来&#xff0c;CLIP引起了广泛的关注。它的方法看似简单&#xff0c;但效果非常出色&#xff0c;许多结果令人惊叹。例如&#xff0c;预训练模型可以在任何视觉分类数据集上实现出色的效果&a…

python中super()用法

super关键字的用法 概述作用语法使用示例1.通过super() 来调用父类的__init__ 构造方法&#xff1a;2.通过supper() 来调用与子类同名的父类方法2.1 单继承2.2 多继承 概述 super() 是python 中调用父类&#xff08;超类&#xff09;的一种方法&#xff0c;在子类中可以通过su…

Zookeeper 入门

第 1 章 Zookeeper 入门 1.1概述 Zookeeper从设计模式角度来理解&#xff1a;是一个基于观察者模式设计的分布式服务管理框架&#xff0c;它负责存储和管理大家都关心的数据&#xff0c;然后接受观察者的注册&#xff0c;一旦这些数据的状态发生变化&#xff0c;Zookeeper就将…

Keysight PXA 常用 visa指令

Keysight PXA N9030B 保存图片

栈和队列篇

目录 一、栈 1.栈的概念及结构 1.1栈的概念 1.2栈的结构示意图 2.栈的实现 2.1支持动态增长的栈的结构 2.2压栈&#xff08;入栈&#xff09; 2.3出栈 2.4支持动态增长的栈的代码实现 二、队列 1.队列的概念及结构 1.1队列的概念 1.2队列的结构示意图 2.队列的实…

指针(一)------指针概念+指针类型+野指针+指针运算+二级指针

&#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C语言 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f339;&#x1f339;&#x1f339;关注我带你学习编程知识 指针&#xff08;一&#xff09; 指针是什么指针…

剪枝基础与实战(5): 剪枝代码详解

对模型进行剪枝,我们只对有参数的层进行剪枝,我们基于BatchNorm2d对通道重要度 γ \gamma γ参数进行稀释训练。对BatchNorm2d及它的前后层也需要进行剪枝。主要针对有参数的层:Conv2d、BatchNorm2d、Linear。但是我们不会对Pool2d 层进行剪枝,因为Pool2d只用来做下采样,没…

MacApp自动化测试之常用工具简介

自动化测试在国内主要以单元测试、API测试、WebUI测试为主&#xff0c;对于MacApp测试却鲜有涉及。但2021年统计MacBook市场占有率接近10%&#xff0c;相比前一年市场占有率提升了26%&#xff0c;可见发展势头非常不错。 与此MacBook上的应用程序MacApp也在有序地发展着&#…

ESP32C3 LuatOS RC522②写入字符串

编写了字符串转16进制表函数 -- 将字符串转换为十六进制表 local function stringToHexTable(str)local hexTable {}local maxLength 16 -- 最大长度为16个元素-- 将字符串转换为十六进制for i 1, #str doif i > maxLength thenbreakendlocal hex string.format("…

解密Spring事务生效的内部机制

声明式事务和编程式事务对比&#xff1a; 声明式事务&#xff1a; 使用注解或XML配置的方式&#xff0c;在代码中声明事务的属性和行为。通过AOP和代理模式实现&#xff0c;将事务管理与业务逻辑代码解耦。适用于大多数情况&#xff0c;简化了代码&#xff0c;提高了可维护性和…