windows下,在Qt中通过c++调用anaconda中的python,使用pytorch

由于项目需求,需要在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);
...
  • 0
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值