python-Qt混合编程

开始的开始,我用qt调用百度AI的人脸识别(post请求),发现代码到了嵌入式端后,post没有任何返回值。近期在调用和风天气的API时也遇到了这个问题。经过一番折腾(让QT支持openssl等)都无济于事,于是开始了我的py+qt之路。

重点提示:

  1. 下载的py的位数必须和qt构建套件里编译器的位数统一(都是32位或者64位),不然编译过不了(ld时找不到函数的定义,应该不同位数的库对函数的修饰不一样)
  2. 被调用的py代码文件要在程序同目录下(嵌入式下要设置work目录)

一、下载安装py

二、在qt工程pro文件中添加py的头文件目录和链接库

  1. 图中是我的设置,由于我要交叉编译到嵌入式,所以做了个系统判别

三、修改python的头文件,因为他的一个定义slots 和QT冲突了

  1. vim {py安装目录}/include/object.h +447
    1. 修改{py安装目录}/include/pyport.h +661 (仅交叉编译器时需要修改)
    2. Py在检测long 的长度时似乎会出错,我在嵌入式设备中printf(sizeof(long)) 得到值为4,所以我这里手动定义SIZE_LONG为4

四、在cpp文件中 #include <Python.h>

五、Cpp中调用py,下面代码是一个完整流程示例

 

 

 

  1. 下面是我的python,文件名为api.py 放于build-mirror-Desktop_Qt_5_7_1_MinGW_32bit-Debug/debug/api.sh
    1. 如果是嵌入式下面,python代码文件放于qt程序同一目录并不能被找到,所以我们要设置下qt的work目录
      1. 在QT中添加如下代码(Py_Initialize()之后)指定work目录,然后把py文件放于这个目录,就能被找到、执行

 

2018年11月20日星期二

Junchao_zhao@yeah.net

 

superyin