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.运行结果



觉得文章对你有帮助,可以用微信扫描二维码捐赠给博主,谢谢!


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

QQ技术交流群:12951803


Windows 下使用 Qt C++ 调用 Python 有多种方法,以下是其中一种比较简单的方法: 1. 安装 Python 和 PyQt 首先,在 Windows 下安装 Python 和 PyQt。 2. 创建 Qt 项目 使用 Qt Creator 创建一个 Qt 项目,选择 C++ 应用程序。 3. 添加 Python 支持 在项目的 .pro 文件中添加以下内容: ``` CONFIG += link_pkgconfig PKGCONFIG += python-3.6 LIBS += -LC:/Python36/libs -lpython36 INCLUDEPATH += C:/Python36/include DEPENDPATH += C:/Python36/include ``` 其中,python-3.6 是你安装的 Python 版本号,C:/Python36 是 Python 的安装路径。 4. 创建 Python 脚本 在项目中创建一个 Python 脚本,例如 test.py,内容如下: ``` def add(a, b): return a + b ``` 5. 在 C++调用 PythonC++调用 Python 可以使用 Python.h 头文件和 Python 的 API。以下是一个简单的示例: ```cpp #include <Python.h> int main(int argc, char *argv[]) { Py_Initialize(); PyObject *pModule = PyImport_ImportModule("test"); if (pModule) { PyObject *pFunc = PyObject_GetAttrString(pModule, "add"); if (pFunc && PyCallable_Check(pFunc)) { PyObject *pArgs = PyTuple_New(2); PyTuple_SetItem(pArgs, 0, PyLong_FromLong(1)); PyTuple_SetItem(pArgs, 1, PyLong_FromLong(2)); PyObject *pResult = PyObject_CallObject(pFunc, pArgs); if (pResult) { long result = PyLong_AsLong(pResult); printf("result=%ld\n", result); Py_DECREF(pResult); } Py_DECREF(pArgs); } Py_DECREF(pFunc); } Py_DECREF(pModule); Py_Finalize(); return 0; } ``` 以上示例代码调用Python 脚本中的 add 方法,传入两个参数 1 和 2,输出结果 3。 注意事项: - 在调用Python API 后需要释放对象,避免内存泄漏。 - 实际项目中,可能需要使用 PyGILState_Ensure 和 PyGILState_Release 来保证线程安全。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itas109

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值