Qt 与python之间的通信(一)

来源:互联网 发布:淘宝送的魔豆 编辑:程序博客网 时间:2024/05/21 15:01
  自己目前了解的qt和python 通信的两种方法。1:利用python模块进行通讯,2;利用Qt进程,调用python.exe来运行py脚本如下是和Qt正常通讯的步骤: 只要遵守如下步骤,和python通讯准没问题。先就讲解第一种方法://添加python运行的库文件路径  Py_SetPythonHome(python_path.toLocal8Bit().data()); //初始化 Py_Initialize();
    if (!Py_IsInitialized()) {
        return false;
    }
    PyObject* pModule = NULL;
    PyObject* pFunc = NULL;
    PyObject* pParam = NULL;
    PyObject* pResult = NULL;
    qDebug()<<"****************************";
    //导入模块
    pModule = PyImport_ImportModule("jar_check");
    if (!pModule) {
        qDebug()<<"------------------import fail---------------";
    }
     //调用模块中的函数
    pFunc = PyObject_GetAttrString(pModule, "main");
    if (!pFunc) {
        Py_DECREF(pModule);
        return false;
    }
    //将c语言的数据类型转换成python对象,意思就是给python传入参数(ss)代表的是元组类型的字符串
    pParam = Py_BuildValue("(ss)", sdk_path.toLocal8Bit().data(),jar_path.toLocal8Bit().data());    //将参数传递给函数
    pResult = PyEval_CallObject(pFunc, pParam);
    if (!pResult) {
        Py_DECREF(pParam);
        Py_DECREF(pFunc);
        Py_DECREF(pModule);
        return false;
    }   
     int code=-1;   //一下是将python返回的数据转换成c的格式。
    if (!PyArg_Parse(pResult, "i", &code)) {
        Py_DECREF(pParam);
        Py_DECREF(pResult);
        Py_DECREF(pFunc);
        Py_DECREF(pModule);
        return false;
    }
    Py_DECREF(pParam);
    Py_DECREF(pResult);
    Py_DECREF(pFunc);
    Py_DECREF(pModule);   //结束
    Py_Finalize();可能,有的人按照如下步骤走:还是会报错:请仔细看:1:工程文件的配置:加上这两句.INCLUDEPATH += \
        -I C:\Python27\include
LIBS += \
        -L C:\Python27\libs -lpython272:在python->lib->site-packages 目录下添加一个*.pth的文件。以pth结尾的。比如path.pth.在里面添加python脚本所要运行的脚本路径;举个例子: import sys sys.path.append(路径)其实就和他的意思一样。这样python就会自动在自己的系统内部去找所运行的脚本。以下是自己写的脚本,只是一小部分。刚好能和上面的例子对应上。import osfrom check import Checkimport sysfrom apktool import ApkToolimport shutil# -*-coding:utf-8-*-def main(sdk_path,jar_path):     print os.getcwd()     jar = ApkTool(jar_path)     temp_path = jar.decode(sdk_path, True)     ver_path=os.path.join(temp_path,"res","raw","lebian_releaseid.txt")     file=open(ver_path,'r')     for i in file:         if i[0]=="V":           version=i.strip('\n')           break     current_path="D:\\"     list=["subpackage","update"]     print("--------------------------------------")     subpackage=Check(temp_path,current_path,version,list)     subpackage.init_fun()     shutil.rmtree(temp_path, True)     return 0if __name__=='__main__':    main(sys.argv[1],sys.argv[2]);
原创粉丝点击