C++中调用python函数(VS2017+WIN10+Anaconda虚拟环境)

1.利用VS创建C++空项目
step1 文件——新建——项目

在这里插入图片描述

step2 Visual C++—— Windows桌面——Windows桌面向导

在这里插入图片描述

step3 选择空项目

在这里插入图片描述

step4 源文件——新建项——添加

在这里插入图片描述

step5 Visual C++——C++文件(.cpp)

在这里插入图片描述

2.配置环境
Step1. 更换成Release与X64

在这里插入图片描述

Step2. 打开项目属性:项目——属性

在这里插入图片描述

Step3. 打开自己的虚拟环境,进入include文件夹,并复制此路径

在这里插入图片描述

Step4. C/C++——常规——添加到包含目录——编辑,将Step3复制的路径复制进去

在这里插入图片描述
在这里插入图片描述

Step5. 打开自己的虚拟环境,进入libs文件夹,并复制此路径

在这里插入图片描述

Step6. 链接器——常规——附加库目录——编辑,并将Step5复制的路径复制进去

在这里插入图片描述

Step7.查看路径C:\Windows\System32下是否有“python版本号.dll”,比如我的虚拟环境中安装的是python3.6.13,就看System32下是否有python36.dll,如果没有就到自己虚拟环境下复制后粘贴到C:\Windows\System32,比如我的虚拟环境的路径为:C:\software\Anaconda\envs\pytorch,到该路径下复制python36.dll到C:\Windows\System32.

在这里插入图片描述
在这里插入图片描述

3.测试
Step1. 写一个Python函数

在源.cpp同目录下,建立一个hello.txt,并将下面的代码复制进去

def add(a,b):  print ("These consequences are from Python code.")  print ("a = " + str(a))  print ("b = " + str(b))  print ("ret = " + str(a+b))  return a + b

后改后缀为.py,如下图:
在这里插入图片描述

Step2. 复制下面的代码到自己创建的源.cpp中。注意!!!路径改为自己的虚拟环境所在的文件夹,另外一定是双斜杠,否则会报错:0x00007FF9428A286E (ucrtbase.dll) (Project2.exe 中)处有未经处理的异常: 请求了严重的程序退出
#include <Python.h>
#include<iostream>using namespace std;int main()
{//需要进行强制类型转换//否则报错“void Py_SetPythonHome(wchar_t *)”: 无法将参数 1 从“const wchar_t [44]”转换为“wchar_t *”	Py_SetPythonHome((wchar_t*)L"C:\\software\\Anaconda\\envs\\pytorch");//Python.exe所在的位置,自己虚拟环境的文件夹下Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化if (!Py_IsInitialized()){printf("初始化失败!");return 0;}else {PyRun_SimpleString("import sys");PyRun_SimpleString("sys.path.append('./')");//这一步很重要,修改Python路径PyObject * pModule = NULL;//声明变量PyObject * pFunc = NULL;// 声明变量pModule = PyImport_ImportModule("hello");//这里是要调用的文件名hello.pyif (pModule == NULL){cout << "没找到该Python文件" << endl;}else {pFunc = PyObject_GetAttrString(pModule, "add");//这里是要调用的函数名PyObject* args = Py_BuildValue("(ii)", 28, 103);//给python函数参数赋值PyObject* pRet = PyObject_CallObject(pFunc, args);//调用函数int res = 0;PyArg_Parse(pRet, "i", &res);//转换返回类型cout << "res:" << res << endl;//输出结果}Py_Finalize();//调用Py_Finalize,这个根Py_Initialize相对应的。}return 0;
}
Step3. 调试——开始调试

在这里插入图片描述

Step4. 测试结果

在这里插入图片描述
成功!!!

4.补充
(1)如果遇到无法查找或打开 PDB 文件的问题,借鉴下面的博客

无法打开PDB文件问题https://blog.csdn.net/qq_41185868/article/details/103206953

(2)如果有问题可在评论区沟通

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

51单片机入门:串口通信

串行通信的初步认识 通信方式分类 1、按照数据传送方式&#xff1a; 并行通信&#xff1a;通信时数据的各个位同时传送&#xff0c;可以实现字节为单位的通信。 但是通信线多&#xff0c;占用资源多&#xff0c;成本高。 串行通信&#xff1a;一次只能发送一位&#xff0c…

先进电机技术 —— 控制策略综述

一、先进电机控制策略综述 电机控制策略随着电力电子技术和微处理器技术的发展而日趋丰富和完善&#xff0c;各种先进的控制方法被广泛应用于直流电动机、交流电动机&#xff08;同步电机、感应电机&#xff09;等多种电机类型。下面是对几种主要先进电机控制策略的概述&#x…

第二届“盘古石杯”全国电子数据取证大赛wp

服务器取证 先对网站进行重构 [rootstudy ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 643626ab3d8b mattermost/mattermost-pre…

Ansible剧本playbook之--------Templates 模块、roles角色详细解读

目录 一、Templates 模块 1.1准备模板文件并设置引用的变量 1.2修改主机清单文件&#xff0c;使用主机变量定义一个变量名相同&#xff0c;而值不同的变量 1.3编写 playbook 1.4ansible主机远程查看修改参数 1.5验证 二、tags 模块 always应用 三、Roles 模块 3.1ro…

Unity Animation--动画窗口指南(使用动画视图)

Unity Animation--动画窗口指南&#xff08;使用动画视图&#xff09; 使用动画视图 window -> Animation 即可打开窗口 查看GameObject上的动画 window -> Animation -> Animation 默认快捷键 Ctrl 6 动画属性列表 在下面的图像中&#xff0c;“动画”视图&am…

《解锁数字化劳动合同签约:构建高效的电子合同签约平台》

随着数字化转型的推进&#xff0c;传统的纸质劳动合同签约方式已经无法满足现代企业对于效率和便捷性的需求。电子劳动合同签约平台应运而生&#xff0c;为企业和员工提供了一种更加高效、便捷的合同签署方式。本文将介绍电子劳动合同签约平台的业务架构&#xff0c;探讨其如何…

智慧公厕的核心技术详解:物联网、云计算、大数据、自动化控制

公共厕所是城市的重要组成部分&#xff0c;而智慧公厕的建设和管理正成为城市发展的重要方向。智慧公厕的核心技术即是物联网、云计算、大数据和自动化控制。下面将以智慧公厕源头实力厂家广州中期科技有限公司&#xff0c;大量精品案例项目现场实景实图实例&#xff0c;详细介…

在MyBatis中,如何将数据库中的字符串类型映射为枚举类型?

在MyBatis中&#xff0c;如何将数据库中的字符串类型映射为枚举类型&#xff1f; 网上看了很多教程。说了很多&#xff0c;但是都没说到重点&#xff01; 很简单&#xff0c;xml文件中&#xff0c; 使用resultType&#xff0c;而不是使用resultMap就可以了。 resultType"…

react18【系列实用教程】useContext —— Context 机制实现越层组件传值 (2024最新版)

什么是 Context 机制&#xff1f; Context 机制是 react 实现外层组件向内层组件传值的一种方案&#xff0c;父组件可以向其内部的任一组件传值&#xff0c;无论是子组件还是孙组件或更深层次的组件。 实现步骤 1.使用createContext方法创建一个上下文对象 Ctx 2.在顶层组件中通…

初始Java篇(JavaSE基础语法)(8)认识String类(上)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaSE 简单介绍&#xff1a;在C语言中已经涉及到字符串了&#xff0c;但是在C语言中要表示字符串只能使用字符数组或者字符指针&#xff0c;可…

Kivy UI界面

一、版本介绍 Ubuntu&#xff1a;18.04.6 LTS Conda&#xff1a;4.5.12 Python&#xff1a;3.6.15 Kivy&#xff1a;2.0.0 二、安装Kivy # 更新系统包列表 sudo apt-get update# 安装Kivy的依赖项 sudo apt-get install -y python-pip libsdl2-dev libsdl2-image-dev li…

Docker私有仓库Harbor

简介 Docker私有仓库Harbor是一个开源的、企业级的Docker registry解决方案&#xff0c;它提供了安全、可靠和高效的容器镜像存储和分发服务。以下是关于Docker私有仓库Harbor的详细介绍&#xff1a; 一、Harbor的特点 基于角色的访问控制&#xff08;RBAC&#xff09;&#…