zoukankan      html  css  js  c++  java
  • 中标麒麟(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()<<("错误! ");
            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  

  • 相关阅读:
    [转]HDR渲染器的实现(基于OpenGL)
    32位微机的内存管理模式
    王爽汇编检测点1.1
    标志位的说明
    通用寄存器的作用
    Debug初次使用
    昨天纠结了一天要始学习dos汇编还是win32汇编,终于想通了
    CPU对存储器的读写(二、数据总线、控制总线)
    CPU对存储器的读写(一、地址总线)
    段寄存器的引用
  • 原文地址:https://www.cnblogs.com/smh2015/p/10036400.html
Copyright © 2011-2022 走看看