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

2024-05-12 02:04

本文主要是介绍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)如果有问题可在评论区沟通

这篇关于C++中调用python函数(VS2017+WIN10+Anaconda虚拟环境)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/981297

相关文章

Python实现一键PDF转Word(附完整代码及详细步骤)

《Python实现一键PDF转Word(附完整代码及详细步骤)》pdf2docx是一个基于Python的第三方库,专门用于将PDF文件转换为可编辑的Word文档,下面我们就来看看如何通过pdf2doc... 目录引言:为什么需要PDF转Word一、pdf2docx介绍1. pdf2docx 是什么2. by

Python函数返回多个值的多种方法小结

《Python函数返回多个值的多种方法小结》在Python中,函数通常用于封装一段代码,使其可以重复调用,有时,我们希望一个函数能够返回多个值,Python提供了几种不同的方法来实现这一点,需要的朋友... 目录一、使用元组(Tuple):二、使用列表(list)三、使用字典(Dictionary)四、 使

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

使用Python实现网页表格转换为markdown

《使用Python实现网页表格转换为markdown》在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,本文将使用Python编写一个网页表格转Markdown工具,需... 在日常工作中,我们经常需要从网页上复制表格数据,并将其转换成Markdown格式,以便在文档、邮件或

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

Python实现pdf电子发票信息提取到excel表格

《Python实现pdf电子发票信息提取到excel表格》这篇文章主要为大家详细介绍了如何使用Python实现pdf电子发票信息提取并保存到excel表格,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录应用场景详细代码步骤总结优化应用场景电子发票信息提取系统主要应用于以下场景:企业财务部门:需

基于Python实现智能天气提醒助手

《基于Python实现智能天气提醒助手》这篇文章主要来和大家分享一个实用的Python天气提醒助手开发方案,这个工具可以方便地集成到青龙面板或其他调度框架中使用,有需要的小伙伴可以参考一下... 目录项目概述核心功能技术实现1. 天气API集成2. AI建议生成3. 消息推送环境配置使用方法完整代码项目特点

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

Python中合并列表(list)的六种方法小结

《Python中合并列表(list)的六种方法小结》本文主要介绍了Python中合并列表(list)的六种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录一、直接用 + 合并列表二、用 extend() js方法三、用 zip() 函数交叉合并四、用