C++与Python混合调试联合调试VS2019 附加调试器失败 找不到python解释器c++调python c++ invoke python Attach to process

C++与Python混合调试联合调试VS2019

最近项目要求c++实时调用python算法,通过python自带的引擎接口,通过c++调用该接口实现python算法调用。
我将测试的源代码将贴在地下,要实现c++调用,在python上实现中断,首先需要vs的支持。我的代码都是在vs2019上实现,至于vs2017和vs2022,应该都是支持的。
我的问题是,首先需要下载离线包,再安装到无internet的计算机,如果您的计算机可以联网,可以忽略download步骤,如果跟我一样不能联网,请跟我一样,使用以下命令下载:

vs_enterprise --layout E:\VS2019_Univesal_PythonLinux --lang zh-CN --add Microsoft.VisualStudio.Workload.ManagedDesktop  --add Microsoft.VisualStudio.Workload.NativeDesktop --add Microsoft.VisualStudio.Workload.NetCoreTools --add Microsoft.VisualStudio.Workload.NativeCrossPlat --add Microsoft.VisualStudio.Workload.Python --add Microsoft.ComponentGroup.PythonTools.NativeDevelopment -add Microsoft.VisualStudio.Workload.Universal --add Microsoft.VisualStudio.Workload.VisualStudioExtension 

注意:
Microsoft.ComponentGroup.PythonTools.NativeDevelopment 该工具必须安装,否则无法实现联合调试;
如果是界面选择,请一定选择安装:
Visual Studio 安装程序中的“Python 开发”工作负载选择“Python 本机开发工具”选项,否则在调试时,将提示python找不到解释器,也无法附加程序调试。
在这里插入图片描述
在这里插入图片描述
安装vs时,请务必勾选“Python本机开发工具”选项:
在这里插入图片描述

按以上设置或者下载安装后,就可以联合调试c++与Python代码了,可以在一个工程中同时中断python和c++代码了。具体设置方式为:
1、右键单击解决方案资源管理器中的 C/C++ 项目,然后选择“属性”。
2、选择“调试”选项卡,从“要启动的调试器”中选择“Python/本机调试”,然后选择“确定”。
在这里插入图片描述
之后就可以在python或者c++代码处设置断点,中断调试了。
VS真的不愧是宇宙第一IDE!
下面贴上python代码:

def MyAdd(a, b) :
    print('Hahah');
    print('HahaOver!!!');
    return a+ b

下面是QT代码:

#include "Python.h"
#include <QtCore/QCoreApplication>
#include <QThread>
#include <QDebug>
#include<iostream>
#include<string.h>
using namespace std;

int main(int argc, char *argv[])
{
    
    
    QCoreApplication a(argc, argv);
    qDebug() << "Start";

	QThread::sleep(10);
	qDebug() << "Sleep OVer";
	Py_SetPythonHome(L"D:/ProgramData/Anaconda3");
	Py_SetPath(L"D:/ProgramData/Anaconda3/Lib;");
	Py_Initialize(); //使用python前要调用此函数,进行初始化

	if (!Py_IsInitialized()) //如果没有初始化成功
	{
    
    
		cout << "fail to initial!" << endl;
		Py_Finalize();
	}

	PyRun_SimpleString("import sys");
	PyRun_SimpleString("sys.path.append(r'D:\\Desktop\\Code\\C++InvokePython\\TestPython')");//设置.py文件所在位置

	//声明变量
	PyObject* pModule = NULL; //.py文件
	PyObject* pFunc = NULL;  //py文件中的函数
	PyObject* pParams = NULL; //函数参数
	PyObject* pResult = NULL;  //函数返回的结果

	pModule = PyImport_ImportModule("TestPython"); //调用上述路径下的Sample.py文件
	if (pModule == NULL)
	{
    
    
		cout << "don't find the python file!" << endl;
	}

	pFunc = PyObject_GetAttrString(pModule, "MyAdd");  //从指定.py文件中调用函数add
	pParams = Py_BuildValue("(ii)", 1, 79);//设置函数参数,i表示int整型,两个i表示有两个参数,s表示字符串等
	pResult = PyObject_CallObject(pFunc, pParams);//调用函数,返回计算结果

	int res;
	PyArg_Parse(pResult, "i", &res);//将返回结果转换成C++类型
	cout << "res:" << res << endl;

	Py_Finalize();
    qDebug() << "Over";
    return a.exec();
}

以上就是一个简单的测试程序,QT调用python算法,并传递数据到python中。最后返回算法结果。
在此之前,使用了winpdb远程调试的模式调试算法,但实际上很勉强,还看不到源代码,而且win7上也不支持,并且winpdb也已经停止了更新…
不得不佩服,vs!!
编辑:myhappyandy

猜你喜欢

转载自blog.csdn.net/myhappyandy/article/details/124074140
今日推荐