由于项目需求,需要在Qt中调用anaconda中的pytorch进行训练等操作,经过查找资料以及测试,成功实现该需求,具体流程如下(前提是已经在anaconda中正确安装好pytorch):
我的pytorch开发环境在:
D:\ProgramData\Anaconda3\envs\pytorch_cuda
1.添加环境变量
将3个路径加到path中去,参考这个
2.在Qt工程的pro文件中引入python 的c++库的头文件以及库:
INCLUDEPATH += $$quote(D:\ProgramData\Anaconda3\envs\pytorch_cuda\include)
LIBS += $$quote(-LD:\ProgramData\Anaconda3\envs\pytorch_cuda\libs) -lpython37
3.然后写代码
#undef slots
#include <Python.h>
#define slots Q_SLOTS
int MainWindow::pythonTest()
{
//设置主目录,就是python的主目录
Py_SetPythonHome(L"D:\\ProgramData\\Anaconda3\\envs\\pytorch_cuda");
//初始化python模块
Py_Initialize();
if(!Py_IsInitialized())
{
return -1;
}
//打印一下python的版本信息
PyRun_SimpleString("print('Python %s on %s' % (sys.version, sys.platform))");
// PyRun_SimpleString("import numpy");
// PyRun_SimpleString("import gym");
PyRun_SimpleString("import torch");
PyRun_SimpleString("print(\"hello pytorch\")");
//结束,释放python
Py_Finalize();
return 0;
}
具体c++与python的参数的传递,可以参考这里:
比较奇怪的是,我这边python的函数返回值只有一个时会出现问题,需要这样子才行:
mCounter = [0, 1]
def trainOnce(data):
mCounter[0] += 1
return mCounter[0], #也就是这里要加个逗号,返回一个tupple才行
同样奇怪的是,输入也要做一下特殊的操作:
...
PyObject* func = PyObject_GetAttrString(pModule, "trainOnce");
//就是这个 "([iiis])", 官方给的例子是"[iiis]",少了个括号。
PyObject* args = Py_BuildValue("([iiis])", 12, 13, 14, "asdr");
auto retVal = PyObject_CallObject(func, args);
...