C++与Pyhon混合调在现实中有很多的应用场景,特别是对基于深度学习的产品开发上。所以无论是VS或者是QT都提供了相应的库来调用Python,本篇将以VS2019为例,大致讲述Python3.7在VS上混合编程的实现(注意:VS混合编程有很多的软件和硬件上的限制,特别是python版本,切勿使用3.9以上的python版本,以免个别函数调用出现问题)

1、Python环境的搭建
Python环境的搭建是混合编程实现的基础必要条件,这里主要包括,解释器的路径、解释器的debug模式(这点最容易出现问题)、python依赖包等,具体如下:
A、下载 Python 解释器并记录解释器位置
B、下载并安装 Debug 包(好多次调用失败就是这里出的错)

其中特别注意安装python版本的debug模式,具体安装如下:
a、右键点击更改

b、增加配置
c、下一步

d、选择debug模式并安装

C、安装代码运行所需依赖的 python 包

2、VS 开发环境的搭建
1、打开项目属性

2、添加库目录



3、常见函数的作用与使用
A、初始化 Py_Initialize(),使用函数前必做动作,可能产生错误,需要进行验证
B、变量申明 PyObject* pModule = NULL;
C、导入包或直接执行 python 指令 PyRun_SimpleString();
D、调用外部包或.py 文件 pModule = PyImport_ImportModule(“mytest”);
E、调用外部函数名或类 pFunc = PyObject_GetAttrString(pModule, “hello”);
F、调用函数 PyEval_CallObject(pFunc, NULL);
G、结束 python 调用 Py_Finalize();

4、参考代码

// testPython.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <Python.h>
using namespace std;//调用hello函数,测试调用外部函数及外部Python sys包的调用
void hello()
{Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化PyObject* pModule = NULL;//声明变量PyObject* pFunc = NULL;// 声明变量pModule = PyImport_ImportModule("mytest");//这里是要调用的文件名pFunc = PyObject_GetAttrString(pModule, "hello");//这里是要调用的函数名PyEval_CallObject(pFunc, NULL);//调用函数Py_Finalize();//调用Py_Finalize,这个根Py_Initialize相对应的。
}//调用add函数,传两个int型参数
void add()
{Py_Initialize();PyObject* pModule = NULL;PyObject* pFunc = NULL;pModule = PyImport_ImportModule("mytest");      //Python文件名  pFunc = PyObject_GetAttrString(pModule, "add");  //Python文件中的函数名  //创建参数:  PyObject* pArgs = PyTuple_New(2);               //函数调用的参数传递均是以元组的形式打包的,2表示参数个数  PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 5));//0---序号  i表示创建int型变量  PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 7));//1---序号  //返回值  PyObject* pReturn = NULL;pReturn = PyEval_CallObject(pFunc, pArgs);      //调用函数  //将返回值转换为int类型  int result;PyArg_Parse(pReturn, "i", &result);    //i表示转换成int型变量  cout << "5+7 = " << result << endl;Py_Finalize();
}//Python测试列表
void testList()
{Py_Initialize();PyObject* pModule = NULL;PyObject* pList = NULL;PyObject* pFunc = NULL;PyObject* pArgs = NULL;pModule = PyImport_ImportModule("mytest");pFunc = PyObject_GetAttrString(pModule, "testList");pArgs = PyTuple_New(1); // 函数调用的参数传递均是以元组的形式打包的, 1表示参数个数double array[] = { 1.2, 4.5, 6.7, 8.9, 1.5, 0.5 };//创建listpList = PyList_New(6);for (int i = 0; i < PyList_Size(pList); i++){PyList_SetItem(pList, i, PyFloat_FromDouble(array[i]));}PyTuple_SetItem(pArgs, 0, pList);//返回值  PyObject* pReturn = NULL;pReturn = PyEval_CallObject(pFunc, pArgs);//调用函数  Py_Finalize();
}
void TestOpencv()
{Py_SetPythonHome(L"C:\\Users\\****\\Anaconda3");Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化PyObject* pModule = NULL;//声明变量PyObject* pFunc = NULL;// 声明变量PyRun_SimpleString("import sys");PyRun_SimpleString("print(sys.executable)");pModule = PyImport_ImportModule("change background");//这里是要调用的文件名pFunc = PyObject_GetAttrString(pModule, "ChangeBackground");//这里是要调用的函数名if (pFunc==NULL){cout << "func exe erre!!" << endl;}PyEval_CallObject(pFunc, NULL);//调用函数Py_Finalize();//调用Py_Finalize,这个根Py_Initialize相对应的。
}
int main()
{cout << "Starting Test..." << endl;cout << "hello()-------------" << endl;hello();cout << "add()---------------" << endl;add();cout << "testList()----------" << endl;testList();TestOpencv();return 0;}

python参考代码:

这里需要将python代码放置在VS生成的exe文件所在目录内,或者自己指定目录

### mytest.py代码
# -*- coding: utf-8 -*-
import sysdef hello():print(sys.executable)
def add(a,b):return a+b
def testList(mylist):print(mylist)def GetValue():array_1 = [1,2,3,4,5]array_2 = [3, 4, 5, 6, 7]return array_1+array_2
print(GetValue())

基于Python的opencv测试代码:

## change background.py测试代码
#!/user/bin/env python
# -*-coding/utf-8 -*-
# Aouher Tao Hongimport cv2
import  numpy as npdef ChangeBackground():img = cv2.imread('photo.jpg')img_back = cv2.imread('background.png')# 日常缩放rows, cols, channels = img_back.shapeimg_back = cv2.resize(img_back, None, fx=0.7, fy=0.7)cv2.imshow('img_back', img_back)rows, cols, channels = img.shapeimg = cv2.resize(img, None, fx=0.4, fy=0.4)cv2.imshow('img', img)rows, cols, channels = img.shape  # rows,cols最后一定要是前景图片的,后面遍历图片需要用到# 转换hsvhsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# 获取masklower_blue = np.array([78, 43, 46])upper_blue = np.array([110, 255, 255])mask = cv2.inRange(hsv, lower_blue, upper_blue)cv2.imshow('Mask', mask)# 腐蚀膨胀erode = cv2.erode(mask, None, iterations=1)cv2.imshow('erode', erode)dilate = cv2.dilate(erode, None, iterations=1)cv2.imshow('dilate', dilate)# 遍历替换center = [50, 50]  # 在新背景图片中的位置for i in range(rows):for j in range(cols):if dilate[i, j] == 0:  # 0代表黑色的点img_back[center[0] + i, center[1] + j] = img[i, j]  # 此处替换颜色,为BGR通道cv2.imshow('res', img_back)cv2.imwrite('output.jpg', img_back)cv2.waitKey(0)cv2.destroyAllWindows()

运行结果:

C++与Python混合编程相关推荐

  1. android与python交互_Android与Python混合编程

    前言 早在2017年的时候,出于业余兴趣,我就开始研究关于Python移植到Android上的实现方案,我一直希望能实现Android与Python的混合编程,并为此写了一系列博客,我希望借助JNI技 ...

  2. python利器怎么编程-C++和Python混合编程的利器

    Python是一种简单易学.功能强大的编程语言,它有高效率的高层数据结构,能简单而有效地实现面向对象编程.Python简洁的语法.对动态输入的支持和解释性语言的本质,使得它在很多领域的大多数平台上都是 ...

  3. python和vb的代码可以通用吗-VB6+Python混合编程(COM组件)(转)

    VB6+Python混合编程(COM组件) 0.2572018.05.10 16:01:23字数 553阅读 3725 Python的方便不用说,VB6做GUI的简单程度更不用说.二者混合编程的需求一 ...

  4. qt如何用python结合_在Qt(C++)中与Python混合编程

    一.PythonQt库 在Qt(C++)中与Python混合编程,可以使用PythonQt库. 网站首页:http://pythonqt.sourceforge.net 下载页面:https://so ...

  5. python优点是代码库支持、灵活_C++和Python混合编程的利器

    Python是一种简单易学.功能强大的编程语言,它有高效率的高层数据结构,能简单而有效地实现面向对象编程.Python简洁的语法.对动态输入的支持和解释性语言的本质,使得它在很多领域的大多数平台上都是 ...

  6. Linux C++与Python混合编程(g++生成链接库与python调用)

    gcc/g++ 链接库的编译与链接 这一篇对动态链接库和静态链接库以及编译结果讲得很清楚,目前看到最好的. Linux下Python与C++混合编程

  7. java和python混合编程_浅谈C++与Java混合编程

    在学习编程的过程中, 我觉得不止要获得课本的知识, 更多的是通过学习技术知识提高解决问题的能力, 这样我们才能走在最前方, 更 多 Java 学习,请登陆疯狂 java 官网. 现实的情况是, 真实的 ...

  8. c++ python混合编程 restful_简单上手nodejs调用c++(c++和js的混合编程)

    因为项目的原因,最近经常使用node.js搭RESTful接口. 性能还是很不错啦,感觉比Spring Boot之类的要快.而且在不错的性能之外,只要程序结构组织好,别让太多的回调把程序结构搞乱,整体 ...

  9. delphi+python混合编程

    基于免费组件Python for Delphi (P4D) ,完成delphi+python的混合编程,delphi完成GUI部分,Python完成后台数据处理部分. Pascal语言语法严谨,层次分 ...

  10. 酷Q 二次开发 C++SDK 加python混合编程

    酷Q 源代码:https://github.com/richardchien/coolq-cpp-sdk 不用问我这个怎么用啊~,去酷Q社区去看看,会C++开发的应该很简单,实在不会留言我有时间QQ交 ...

最新文章

  1. 广州网络推广介绍有关单页面的优化技巧!
  2. 原价买了二手机,我是如何做到的?
  3. Java那些事之Berkeley DB
  4. 【嵌入式开发】ARM 代码搬移 ( ARM 启动流程 | 代码搬移 起点 终点 | 链接地址 | 汇编代码 )
  5. SP Session
  6. BLE-NRF51822教程5-静态密码设置
  7. Windows消息机制学习笔记(二)—— 窗口与线程
  8. vue子组件获取父组件数据_在vue.js中父组件是如何向子组件传递数据的?
  9. delphi7升级delphi2007可以互用马_奶爸带娃玩“升级版摇摇马”火了,像极了传说中的“甘为孺子牛”...
  10. struts+hibernate+oracle+easyui实现lazyout组件的简单案例——Dept实体类和对应的配置信息
  11. 2013二级计算机c语言50,2013年计算机二级C语言课后模拟题五及答案
  12. codevs1287 矩阵乘法
  13. File存对象--android 的File存储到SD卡();
  14. Silverlight+WCF 新手实例 象棋 介绍II(九)
  15. Redis 3.2.4编译安装
  16. cmd NTSD命令用法详解
  17. 世界上再也找不到第二位程序员大叔能写出这样纯美的数学小说了
  18. win7计算机搜索文件搜不到,Win7搜不到文件如何解决?Win7搜不到文件的解决方法...
  19. Nacos注册中心和配置中心
  20. 禅与摩托车维修艺术中提到的“刀”

热门文章

  1. C语言语法错误与语义错误的区别
  2. 解决同一条sql在pl/sql工具中执行很快,在程序中却很慢
  3. Android进阶之路 - 双端交互之传递Base64图片
  4. 如何在Inceptor中使用日期函数获取与转换时间
  5. Jupyter notebook切换python版本
  6. python画散点图-python绘制散点图
  7. 关于知云文献翻译显示乱码,无法翻译的解决方法
  8. UEFI学习 (一) ——下载与编译
  9. Python的包管理工具
  10. SVM之Libsvm工具包的安装教程