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

转自: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()<<("导入pytest失败!");
        return ;
    }
    /* 获得模块中函数并检验其有效性 */
    dic = PyModule_GetDict(module);
    if(!dic)
    {
        qDebug()<<("错误!\n");
        return ;
    }
    /* 获得sum函数地址并验证 */
    func = PyDict_GetItemString(dic,“test_add”);
    if(!PyCallable_Check(func))
    {
        qDebug()<<"不能找到函数 "<<funcname1;
        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  

 

版权声明:本文为smh2015原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/smh2015/p/10036400.html