【Linux中QT加载.so库与调用Python】

一、如何导入.so库

1.1 不同系统中 库名称各有不同

例如: Windows 中为 dll、Linux 中为 so 等 

1.2 Linux中的QT导入库方法:

打开QT点击文件右键选择ADD Library 进入到该界面

请添加图片描述
请添加图片描述请添加图片描述以上添加库函数成功,在Windows中操作同理

二、调用Python

2.1 添加Python库

下图为Linux中调用的地址找到 .so 文件添加即可,Windows方式也大致相同。

INCLUDEPATH += -I /usr/include/python2.7/
LIBS += /usr/lib/python2.7/config-aarch64-linux-gnu/libpython2.7.so

请添加图片描述

2.2 创建Python文件 引入头文件

2.2.1 创建Python文件

在这里插入图片描述
当前我们用add这个函数来演示功能,将python文件内容写好后我们进入下一步
请添加图片描述

2.2.2 引入头文件

#include <Python.h>  //没有报错,即为成功

在这里插入图片描述

2.3 调用Python文件

2.3.1 调用Python函数

获取Python文件路径 是将创建的python文件放到 debug/release 文件下 也就是可执行文件

//进行初始化
Py_Initialize();
if (!Py_IsInitialized()) {
	qDebug()<<"cant open python Py_IsInitialized")<<endl;;
	return;
}
//获取python文件路径
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
//加载Python模块
PyObject* pModule = PyImport_ImportModule("gpio_inout");
if (!pModule) {
	qDebug()<<"cant open python pModule")<<endl;;
	return;
}
//加载Python模块中的函数
PyObject* pGetFun = PyObject_GetAttrString(pModule,"add");
if (!pGetFun ) {
	qDebug()<<"cant open python pGetFun ")<<endl;;
	return;
}

2.3.2 对Python函数传参

//新建组,存放参数
PyObject *fun2 = PyTuple_New(2);
//参数赋值
int ia=1,ib=2;  
//对add函数传入 第一个参数与第二个参数
PyTuple_SetItem(fun2 ,0,Py_BuildValue("i",ia)); //其中的i代表int d为double
PyTuple_SetItem(fun2 ,1,Py_BuildValue("i",ib));

2.3.3 获取函数返回值

//接收返回值
PyObject *pReturn1 = PyEval_CallObject(pGetFun,fun2);
//转换为C++的对应数据类型
int iout;
PyArg_Parse(pReturn1, "i", &iout);
//打印输出
Debug()<<"iout:"<<iout<<endl;
//初始化结束 
Py_Finalize();

2.3.4 输出显示

输出代码 为相加结果 与hello world! 与 传入对应参数
在这里插入图片描述

三、完整代码

//进行初始化
Py_Initialize();
if (!Py_IsInitialized()) {
	qDebug()<<"cant open python Py_IsInitialized")<<endl;;
	return;
}
//获取python文件路径
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
//加载Python模块
PyObject* pModule = PyImport_ImportModule("gpio_inout");
if (!pModule) {
	qDebug()<<"cant open python pModule")<<endl;;
	return;
}
//加载Python模块中的函数
PyObject* pGetFun = PyObject_GetAttrString(pModule,"add");
if (!pGetFun ) {
	qDebug()<<"cant open python pGetFun ")<<endl;;
	return;
}

//新建组,存放参数
PyObject *fun2 = PyTuple_New(2);
//参数赋值
int ia=1,ib=2;  
//对add函数传入 第一个参数与第二个参数
PyTuple_SetItem(fun2 ,0,Py_BuildValue("i",ia)); //其中的i代表int d为double
PyTuple_SetItem(fun2 ,1,Py_BuildValue("i",ib));

//接收返回值
PyObject *pReturn1 = PyEval_CallObject(pGetFun,fun2);
//转换为C++的对应数据类型
int iout;
PyArg_Parse(pReturn1, "i", &iout);
//打印输出
Debug()<<"iout:"<<iout<<endl;
//初始化结束 
Py_Finalize();

以上为整套流程演示

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

矩阵君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值