C++调用python: VS2017 + Anaconda + pypi第三方库

2023-12-01 15:01

本文主要是介绍C++调用python: VS2017 + Anaconda + pypi第三方库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

步骤一:在Anaconda中创建虚拟环境

        这一点对大家来说应该很简单,简单介绍一下,不做过多解释。值得注意的是,要用conda命令创建环境,用pip install配置环境。

conda create -n c_python_env python==3.9 # 用conda创建python虚拟环境
conda activate c_python_env              # 激活该虚拟环境
pip install numpy                        # 在虚拟环境中用pip安装python包

在Anaconda的安装目录下,可以看到如下文件夹,就是我们新创建的环境:

步骤二:在VS2017中,创建一个C++项目: C_Python

        具体过程不再赘述,在项目中创建一个文件“c_python_test.cpp”,添加以下内容:

c_python_test.cpp

#include <Python.h>
#include <iostream>
#include <string>
using namespace std;int main_()
{	//1. 初始化Py_Initialize();//使用python之前,要调用Py_Initailize()函数,进行初始化if (!Py_IsInitialized){printf("初始化失败!!");return 0;}PyRun_SimpleString("print('hello world')");PyRun_SimpleString("import numpy as np");Py_Finalize();system("pause");return 0;
}

 步骤三:在VS2017中配置Anaconda创建的python环境

VS2017的设置如下:

        1)在VS的项目属性>>配置属性>>VC++目录>>包含目录中,将Anaconda虚拟环境的根目录下的include文件夹添加进来;

        2)在VS的项目属性>>配置属性>>VC++目录>> 库目录中,将Anaconda虚拟环境的根目录下的libs文件夹添加进来

         3)然后在VS的项目属性>>配置属性>>链接器>>输入>>附加依赖项中,Anaconda虚拟环境的根目录下的libs/python39_d.lib添加上。如果没有python39_d.lib文件,就把python39.lib复制一份,重命名为python39_d.lib。

 4)拷贝Anaconda虚拟环境的根目录下的“DLLs”和“Lib”两个文件夹复制到exe所在文件夹(x64/Release)。没有exe文件夹就先编译生成一个。这一步很重要,否则C++无法找到虚拟环境中的第三方依赖库,比如我们上面安装的numpy库。

     

拷贝到

      

        5)如果有必要,把Anaconda虚拟环境中的python3.lib、python39.lib和python39_d.lib也拷贝到exe所在文件夹(x64/Release)。再一次,如果环境中没有python39_d.lib文件,就把python39.lib复制一份,重命名为python39_d.lib。(在我的测试中,这一步不执行也没问题)

拷贝到:

 步骤四: 在VS2017中,生成并运行项目

得到以下输出,表示设置成功。 

升级--步骤五:创建python工程py_script,C++引入python脚本

        假设python脚本的绝对路径为D:/wzg_projects/C_Python/py_script(具体在哪里无所谓)。创建以下两个python脚本

demo.py

import numpy as np def formula1(A,F):print(A,F)return np.array(A*F)

 hello.py

import demo as d def func(a,b):num = d.formula1(10,20)print("result = {}".format(num))print("hello world")

在VS2017中,更改 c_python_test.cpp 脚本的内容:

c_python_test.cpp


#include <iostream>
#include <Python.h>
#include <string>
using namespace std;int main_()
{// 1. 开始python与c++的接口模块,初始化。Py_Initialize();//使用python之前,要调用Py_Initailize()函数,进行初始化if (!Py_IsInitialized()){printf("python与c++的接口模块初始化失败");return 0;}// 2. 可行性的基础验证,测试成功后可注释掉//PyRun_SimpleString("print('hello world')");//PyRun_SimpleString("import numpy as np");// 3. 添加python脚本的搜索路径PyRun_SimpleString("import sys");PyRun_SimpleString("sys.path.append('D:/wzg_projects/C_Python/py_script')");// 4. 定义pythonObject类对象,并实例化,前向计算PyObject* pModule = NULL;PyObject* pFunc = NULL;// 1)pModule实例化pModule = PyImport_ImportModule("hello");//通过python文件名寻找python脚本,文件名不用加后缀,把python脚本编码为c++格式if (pModule == NULL)  // 如果找不到文件就报错{cout << "没找到python脚本:hello.py" << endl;return 0;}// 2) pFunc 实例化pFunc = PyObject_GetAttrString(pModule, "func");//从pModule脚本中提取名字为“func”的函数,封装为c++格式的pFunc函数if (!pFunc || !PyCallable_Check(pFunc)) {cout << "没找到python函数:func" << endl;return 0;}// 3) 把C++变量转变成Python格式//    i) 参变量的定义方式1//PyObject* pArgs = Py_BuildValue("ii", 25, 6); // 定义函数的参变量。"ii"表示定义两个int类型的变量。还有许多其他格式,可以具体情况具体改变。//    ii) 参变量的定义方式2--推荐使用PyObject* pArgs = PyTuple_New(2);PyTuple_SetItem(pArgs, 0 ,Py_BuildValue("i", 25)); // 把一个int类型的数据“25”放在python tuple的索引为0的位置。PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 6)); // 把一个int类型的数据“25”放在python tuple的索引为0的位置。// 4) 运行python函数PyObject* pReturn = PyObject_CallObject(pFunc, pArgs); // 运行python函数,计算函数的输出结果。把参数args2输入到函数pFunc中,计算输出结果,存储到pRet中。// 5. 把python格式的数据转变成c++格式int cReturn = 0;PyArg_Parse(pReturn, "i", &cReturn);//注意:PyArg_Parse的最后一个参数,必须加上“&”符号。“i”表示转变成int类型的变量。cout << "cReturn:" << cReturn << endl;// 6. 结束python与c++的接口模块Py_Finalize();system("pause");return 0;
}

        重新生成项目,运行,可以实现对python脚本的调用。具体如何调用,请看上面的代码,注释还是比较详细的。

提示与思考:

  1.  如果python脚本中存在bug,无法运行,或找不到依赖库,c++脚本仍旧可以顺利编译成功,但是在运行时会提示无法找到python文件,比如无法找到上面的“hello.py”
  2. 步骤三中的过程----拷贝Anaconda虚拟环境的根目录下的“DLLs”和“Lib”两个文件夹复制到exe所在文件夹(x64/Release)。没有exe文件夹就先编译生成一个。这一步很重要,否则C++无法找到虚拟环境中的第三方依赖库,比如我们上面安装的numpy库。 这一步不可省略。经试验,把这两个文件夹添加到vs2017的库目录中,也无法解决这个问题。
  3. 在步骤五的c_python_test.cpp脚本中,需要设置python脚本的寻找路径,防止C++找不到python脚本。为了未来的可扩展性、易用性和可移植性,或许这一步可以通过cmake、qt等方式以自动化的方式解决。
  4. 应该编写一个接口函数,用于c++和python相互传递参数,并把这个函数固定下来。
  5. linux环境下,没有vs2017,应该如何设置c++的python依赖库呢?用cmake编译好?

 

参考及进一步学习:

[1] C++调用python方法及环境配置(Windows环境、VS工具)

[2] C++调用Python遇到的问题总结(anaconda的虚拟环境、使用python第三方库,如pytorch、pytorch geometric) [3] C++调用Python(混合编程)函数整理总结

[4] C++调用python脚本 

[5] C/C++ 调用Python 

[6] C++调用python 之 环境配置(VS2015 + anaconda)

[7] C++调用python文件(包含第三方库) 

更多扩展教程:

[1]  图像处理深度学习python代码改写成c++推理

[2] python调用C++中的函数【最简明教程】 

[3] [pybind11]为c++项目写python API接口 - 知乎 

[4] C++和python的代码如何相互调用? - 知乎 

这篇关于C++调用python: VS2017 + Anaconda + pypi第三方库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

Python下载Pandas包的步骤

《Python下载Pandas包的步骤》:本文主要介绍Python下载Pandas包的步骤,在python中安装pandas库,我采取的方法是用PIP的方法在Python目标位置进行安装,本文给大... 目录安装步骤1、首先找到我们安装python的目录2、使用命令行到Python安装目录下3、我们回到Py