qt调用python

qt调用python首先需要添加动态链接库

qt调用python_第1张图片

#python
LIBS += -L./python39/libs/ -lpython39

INCLUDEPATH += ./python39/include
INCLUDEPATH += ./python39/Lib/site-packages/numpy/core/include

 这个路径的话呢,因为我有把需要用到的库直接复制到当前的项目文件夹所以就直接 ./ 就好了。

qt调用python_第2张图片

 python39就是我的啦。如果不知道该拷贝什么,就直接把这个文件夹拷贝过来就行了,至于名字为什么不是pytorch39,我改了一下嘛。。。qt调用python_第3张图片

 如果需要知道具体该复制什么内容,可以看看别的博客,不知道的话就麻烦一点整个都复制一下,反正肯定不会错。下面是我的python库文件夹的内容,有的也是不要的,就不仔细删了。

qt调用python_第4张图片

添加完动态链接库,进行构建可能会报这种错,提示无法打开文件“python39_d.lib”

将python39.lib复制副本,名称改为python39_d.lib,解决.

qt调用python_第5张图片

接下来就是添加头文件了。

#include "Python.h"
#include 

添加完编译会直接报错,

无法解析的外部符号 __imp___Py_RefTotal
无法解析的外部符号 __imp___Py_NegativeRefcount,该符号在函数 __import_array 中被引用

需要对拷贝过来的文件夹python39/include里面的object.h和pyconfig.h 两个文件进行修改。

object.h

修改:

#if defined(Py_DEBUG) && !defined(Py_REF_DEBUG)
#define Py_REF_DEBUG
#endif

#if defined(Py_DEBUG) && !defined(Py_REF_DEBUG)
//#define Py_REF_DEBUG
#endif

修改

typedef struct{
    const char* name;
    int basicsize;
    int itemsize;
    unsigned int flags;
    PyType_Slot *slots; /* terminated by slot==0. */
} PyType_Spec;

为:

#undef slots
typedef struct{
    const char* name;
    int basicsize;
    int itemsize;
    unsigned int flags;
    PyType_Slot *slots; /* terminated by slot==0. */
} PyType_Spec;
#define slots Q_SLOTS

pyconfig.h

#ifdef _DEBUG
#       define Py_DEBUG
#endif

改为

#ifdef _DEBUG
//#       define Py_DEBUG
#endif

然后就不会报那个错了。

接下来开始添加一些必要的代码。

//************python初始化*******
    Py_SetPythonHome(L"D:/conda/envs/pytorch39");//这行代码要写在最前面,不然会出问题
    Py_Initialize();     //初始化
    if (!Py_IsInitialized()) {
        ui->Record->append("inititalize failed");
        return;
    }
    else
        ui->Record->append("inititalize success");

    import_array();

    // 添加当前路径(读文件的时候才需要)
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./')");
Py_SetPythonHome(L"D:/conda/envs/pytorch39");是python解释器的位置,就是python.exe所在的位置,用过python写代码的应该都清楚,这个在你自己安装python的位置,像我安装的是Anaconda,这个exe文件就在我配置的环境目录里面。这个是一样要写绝对路径的,写其他的会出问题。

 import_array();这句代码也是要的,但编译的时候会报错,点进去吧return NULL去掉NULL就行了。

最后,在析构函数中加上这个话

//销毁python调用   
 Py_Finalize(); //调用结束,销毁

基本的配置问题就说明白了,具体用python做什么事情就靠自己去百度啦。

你可能感兴趣的:(qt,开发语言)