自己目前了解的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 -lpython27
2:在python->lib->site-packages 目录下添加一个*.pth的文件。以pth结尾的。比如path.pth.
在里面添加python脚本所要运行的脚本路径;
举个例子:
 import sys
 sys.path.append(路径)
其实就和他的意思一样。这样python就会自动在自己的系统内部去找所运行的脚本。



以下是自己写的脚本,只是一小部分。刚好能和上面的例子对应上。
import os
from check import Check
import sys
from apktool import ApkTool
import 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 0
if __name__=='__main__':
    main(sys.argv[1],sys.argv[2]);