A40i使用笔记:qt调用python

一、前言

linux 下qt调用python运算,这里记录一下,有些问题太坑了,也分享出来让大家避坑

二、环境

linux3.10

python3.6.5

三、正文

正常调用步骤

pro引用相关库,用到numpy就安装一个,在引用头文件

LIBS += -L/root/workspace/allwinner/A40i/FCU2401ubuntu16/lichee/MyApp/buildpy3.6.5/lib/ -lpython3.6m
INCLUDEPATH += /root/workspace/allwinner/A40i/FCU2401ubuntu16/lichee/MyApp/buildpy3.6.5/include/python3.6m
DEPENDPATH += /root/workspace/allwinner/A40i/FCU2401ubuntu16/lichee/MyApp/buildpy3.6.5/include/python3.6m

INCLUDEPATH += /root/workspace/allwinner/ubuntuAPP/Python-3.6.5/buildpy3.6.5/lib/python3.6/site-packages/numpy/core/include/numpy

头文件包含

#include 
#include 
#include 
#include 
#include 

初始化和运行

    Py_SetPythonHome(L"/usr/local/python3");//这行代码要写在最前面,不然会出问题

// 初始化python解释器.C/C++中调用Python之前必须先初始化解释器
    Py_Initialize();

 QVector cgq_sd_speed[4];//4通道速度数值
    qDebug()<<"cgq_jsd_speed group size is "<(pRet);
    if (pNumPyArray){
        double *pData = reinterpret_cast(PyArray_DATA(pNumPyArray));
        for(int i = 0; i < 4; i++){
            for (int j = 0; j < Datapoint; j++) {
                cgq_sd_speed[i].append(pData[i * cgq_jsd_speed[0].size() + j]);
            }
        }
    }
    else{
        qDebug()<<"sudu max value:0 somewhere is wrong! PyEval_CallObject err";
    }
 //释放数据缓存
    PyGC_Collect();//垃圾回收函数,否则无法多次调用,多次调用内存会急剧上升直至崩溃
    Dataall.clear();//清空原始数据数组,等待下次采集分析

//     撤销Py_Initialize()和随后使用Python/C API函数进行的所有初始化
    Py_Finalize();

将python文件放在与qt程序同级目录就行了

下面分享大坑解决办法:


大坑1:程序手动执行./xxx可以执行,调用到python时也正常,但是在脚本里开机自动执行,在调用到python时就提示错误,如下

[   20.618186] rc.local[2231]: Could not find platform independent libraries 
[   20.619269] rc.local[2231]: Could not find platform dependent libraries 
[   20.619911] rc.local[2231]: Consider setting $PYTHONHOME to [:]
[   20.651721] rc.local[2231]: Fatal Python error: Py_Initialize: Unable to get the locale encoding

或者PyImport_ImportModule err或者Py_Initialize err这种

问题就是环境配置问题,需要在qt初始化前配置一下python的环境,如果环境配置不对会提示初始化错误,环境配置正确了还没完事,到PyImport_ImportModule函数时会报错,这时要将

 PyRun_SimpleString("sys.path.append('/root/workspace/')");这句话设置为python程序的绝对路径

默认是    PyRun_SimpleString("sys.path.append('./')");但是不知道为什么开机自动执行脚本在调用程序执行到这里就失败,搞了一天一宿才解决这个问题,心累。

大坑1 end


大坑2:

四、结语

你可能感兴趣的:(#,全志A40i,qt,python,python自动运行,python手动运行,python自启失败,qt调用python)