最近一个在做一个项目,框架全是用qt搭建的,但是里面有个功能需要调用一下之前写的python脚本。
具体环境:ubuntu16.04
python3.5(网上好多资料是关于python2.0的,存在一些区别)
qt5.8.0
尝试了以下几种办法,踩了很多坑,记录一下。、
1. Py_Initialize实现参数传递
因为需要向python脚本内传递参数,查阅之后发现可以在QT内导入python包,然后通过Py_Initialize这种方法实现参数传递。
具体操作:
1) 在.pro文件中导入python库(找到自己虚拟机内python的安装路径)
INCLUDEPATH += -I /usr/include/python3.5/
LIBS += -L /usr/lib/python3.5/config-3.5m-x86_64-linux-gnu -lpython3.5
2)由于QT中定义了slots作为关键了,而python3中有使用slot作为变量,所以在编译时会有冲突。
需要修改python库中的object.h文件,因为该文件是系统文件,可以在终端中sudo gedit进行修改:
sudo gedit /usr/include/python3.5/object.h
//应该是在440-448行
typedef struct{
const char* name;
int basicsize;
int itemsize;
unsigned int flags;
#undef slots //这里取消slots宏定义
PyType_Slot *slots; /* terminated by slot==0. */
#define slots Q_SLOTS //这里恢复slots宏定义与QT中QObjectDefs.h中一致
} PyType_Spec;
3)测试代码如下,我的需求就是,传入一个字符串,然后返回一个脚本处理过后的字符串
#test.py
def testpy(a):
b = a+