最近项目要求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
#include
#include
#include
#include
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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)