转自: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

中标麒麟(linux)下Qt调用python数据转换的更多相关文章

  1. 中标麒麟(linux)下Qt调用python

    转自:https://blog.csdn.net/lwlgzy/article/details/83857297 http://www.cnblogs.com/jiaping/p/6321859.ht ...

  2. Linux下Qt调用共享库文件.so

    修改已有的pro文件,添加如下几句: INCLUDEPATH += /home/ubuntu/camera/camera/LIBS += -L/home/ubuntu/camera/camera -l ...

  3. 基于Linux(中标麒麟)上QT的环境搭建

    最近由于公司需要,需要在中标麒麟上进行QT的二次开发,但是网上的资料很少,就算是有也基本都是其他的版本的Linux上的搭建.中标麒麟本身的资料也很好,而且还只能试用60天. 下面就介绍下我对此环境的搭 ...

  4. 国产中标麒麟Linux部署dotnet core 环境并运行项目 (二) 部署运行控制台项目

    背景 在上一篇文章安装dotnet core,已经安装好dotnet core了.之前只是安装成功了dotnet, 输入dotnet --info,可以确认安装成功了,但是在运行代码时,还是报错了,本 ...

  5. Linux下Qt的安装与配置

    参考资料:http://www.cnblogs.com/emouse/archive/2013/01/28/2880142.html Linux 下编译.安装.配置 QT 下载qt 这里用的是4.7. ...

  6. linux下java调用.so动态库方法2: JNA

    摘自:http://blog.csdn.net/todorovchen/article/details/21319033 另请参见: http://blog.sina.com.cn/s/blog_8c ...

  7. linux下java调用.so文件的方法1: JNI

    摘自http://blog.163.com/squall_smile/blog/static/6034984020129296931793/ https://my.oschina.net/simabe ...

  8. [转]linux下编译boost.python

    转自:http://blog.csdn.net/gong_xucheng/article/details/25045407 linux下编译boost.python 最近项目使用c++操作python ...

  9. linux下C调用lua的第一个程序

    linux下C调用lua的第一个程序 linux的环境是Fedora 18,运行在VM workstation中,以开发模式安装,自带了lua 5.1.4,可以在命令行上直接用lua命令进入到lua环 ...

随机推荐

  1. 【译】为什么BERT有3个嵌入层,它们都是如何实现的

    目录 引言 概览 Token Embeddings 作用 实现 Segment Embeddings 作用 实现 Position Embeddings 作用 实现 合成表示 结论 参考文献 本文翻译 ...

  2. 2017.2.6Redis连接问题排查

    现象:早8:15起开始收到redis主从不停切换的报警短信,某系统连接流控redis报超时. 排查:1.查看zabbix,看流控系统的redis服务器是否正常——正常: 2.查看redis监控,red ...

  3. CSS初识盒子

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  4. jq 获取下一个兄弟原素 下拉箭头旋转

    $('.weui-cells__title').on("click", function(e,rr){ isshow=$(this).attr('isshow') if(issho ...

  5. CS通用项目系统搭建——三层架构第二天

    一.编写配置文件 首先找到编写配置文件的位置.winform会在app.config.webform写在web.config中. <?xml version="1.0" en ...

  6. Spring <mvc:default-servlet-handler/>

    优雅REST风格的资源URL不希望带 .html 或 .do 等后缀.由于早期的Spring MVC不能很好地处理静态资源,所以在web.xml中配置DispatcherServlet的请求映射,往往 ...

  7. MongoDB集群的搭建

    一.环境准备 1.Centos7 2.mongodb3.4.10 3.三台机器IP分别是:192.168.1.100.192.168.1.135.192.168.1.136 二.mongdb数据库的安 ...

  8. audiounit错误码对应值查询

    https://www.osstatus.com/search/results?platform=all&framework=all&search=(错误码的值) EX:  https ...

  9. python note 11 函数名的使用、闭包、迭代器

    1.函数名就是一个变量 def func(): print("我是一个小小的函数") a = func print(a) #输出变量存放地址 <function func a ...

  10. MySql 游标定义时使用临时表

    参考:Re: Temp Table in Select of a Cursor 方法一: delimiter $$ create procedure test_temp() begin drop te ...