qt调用python函数_中标麒麟(linux)下Qt调用python数据转换

本文介绍了如何在中标麒麟Linux环境下,使用C++的Qt框架调用Python函数进行数据转换。通过Py_Initialize初始化Python解释器,导入Python模块,获取并执行指定函数,最后通过Py_Finalize结束解释器。示例中展示了调用Python函数test_add进行加法运算,并将结果转换回C++的long类型。
摘要由CSDN通过智能技术生成

转自:https://blog.csdn.net/itas109/article/details/78733478

mytest.py文件

# -*- coding: utf-8 -*-

def hello():

print("hello python!")

def test_add(a, b):

c = a + b

print( a, "+", b," = ",c)

return c

C++关键代码

/* Python解释器的初始化*/

Py_Initialize();

if(!Py_IsInitialized())

{

qDebug()<< ("初始化失败!");

return ;

}

PyRun_SimpleString("import sys");

PyRun_SimpleString("sys.path.append('./')");

/* 导入Python模块,并检验是否正确导入 */

modulename = Py_BuildValue("s", "mytest");

module = PyImport_Import(modulename);

if(!module)

{

qDebug()<

return ;

}

/* 获得模块中函数并检验其有效性 */

dic = PyModule_GetDict(module);

if(!dic)

{

qDebug()<

return ;

}

/* 获得sum函数地址并验证 */

func = PyDict_GetItemString(dic,“test_add”);

if(!PyCallable_Check(func))

{

qDebug()<

return ;

}

// 创建元组设置参数

PyObject* args = PyTuple_New(2); // 2个参数

PyObject* arg1 = PyLong_FromLong(4); // 参数一设为4

PyObject* arg2 = PyLong_FromLong(3); // 参数二设为3

PyTuple_SetItem(args, 0, arg1);

PyTuple_SetItem(args, 1, arg2);

// 调用函数

PyObject* pRet = PyObject_CallObject(func, args);

// 获取参数

if (pRet) // 验证是否调用成功

{

long result = PyLong_AsLong(pRet);

LogInfo << "result:" << result;

}

/* 结束Python解释器 */

Py_Finalize();

Py_BuildValue函数

// 创建元组设置参数

PyObject* args = PyTuple_New(2); // 2个参数

args= Py_BuildValue("(i,i)",4,3);

作用:将C/C++类型类型的数据转变成PyObject*对象。

原型:PyAPI_FUNC(PyObject*) Py_BuildValue(const char *format, ...);(VC中复制过来的),有点类似与printf(format,…).

参数解释:format及转换格式,类似与C语言中%d,%f,后面的不定参数对应前面的格式,具体格式如下:

"s"(string) [char *] :将C字符串转换成Python对象,如果C字符串为空,返回NONE。

"s#"(string) [char *, int] :将C字符串和它的长度转换成Python对象,如果C字符串为空指针,长度忽略,返回NONE。

"z"(string or None) [char *] :作用同"s"。

"z#" (stringor None) [char *, int] :作用同"s#"。

"i"(integer) [int] :将一个C类型的int转换成Python int对象。

"b"(integer) [char] :作用同"i"。

"h"(integer) [short int] :作用同"i"。

"l"(integer) [long int] :将C类型的long转换成Pyhon中的int对象。

"c"(string of length 1) [char] :将C类型的char转换成长度为1的Python字符串对象。

"d"(float) [double] :将C类型的double转换成python中的浮点型对象。

"f"(float) [float] :作用同"d"。

"O&"(object) [converter, anything] :将任何数据类型通过转换函数转换成Python对象,这些数据作为转换函数的参数被调用并且返回一个新的Python对象,如果发生错误返回NULL。

"(items)"(tuple) [matching-items] :将一系列的C值转换成Python元组。

"[items]"(list) [matching-items] :将一系列的C值转换成Python列表。

"{items}"(dictionary) [matching-items] :将一系类的C值转换成Python的字典,每一对连续的C值将转换成一个键值对。

---------------------

作者:itas109

来源:CSDN

原文:https://blog.csdn.net/itas109/article/details/78733478

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值