Windows下QT中用C++调用Python之三 - 基础参数的传入和传出

如需转载请标明出处: http://blog.csdn.net/itas109  

QQ技术交流群:129518033


Windows下QT中用C++调用Python之一 - 基础调用

Windows下QT中用C++调用Python之二 - 编译BUG处理


环境:

Python35:python-3.5.4  32位

QT:5.6.2 32位

编译器:Visual Studio 2013

操作系统:windows 7 64Bit SP1


在完成了QT调用Python的基础调用之后,我们需要了解一下C++如何向Python传参数和C++如何处理Python的返回参数

hello.py文件内容:

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

def hello():
    print("hello python!")

def test_add(a, b):
	c = a + b
	print( a, "+", b," = ",c)
	return c


下面只贴出关键代码:

1.C++如何向Python传参数

相应的数据类型转换为PyObject*类型

     1.1创建元组设置参数

    // 创建元组设置参数
    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(pv, args);


    1.2 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值将转换成一个键值对。


2.C++如何处理Python的返回参数

PyObject*类型转换为相应的数据类型

    // 获取参数
    if (pRet)  // 验证是否调用成功
    {
        long result = PyLong_AsLong(pRet);
        LogInfo << "result:" << result;
    }


   3.运行结果

Windows下QT中用C++调用Python之三 - 基础参数的传入和传出_第1张图片


觉得文章对你有帮助,可以用微信扫描二维码捐赠给博主,谢谢!
Windows下QT中用C++调用Python之三 - 基础参数的传入和传出_第2张图片

  如需转载请标明出处:http://blog.csdn.net/itas109 

QQ技术交流群:12951803


你可能感兴趣的:(Python,Python入门篇)