Qt C++ 调用 Python 之 PyObject

在 Qt C++ 中调用 Python 时,可以通过 PyObject 获取和操作各种 Python 对象。以下是一些常见的 Python 对象类型及其对应的 PyObject 操作:

  1. 整数(int)

    PyObject* pyInt = PyLong_FromLong(42); // 创建一个 Python 整数对象
    long value = PyLong_AsLong(pyInt);     // 从 Python 整数对象中获取值
    Py_DECREF(pyInt);                      // 释放对象
    
  2. 浮点数(float)

    PyObject* pyFloat = PyFloat_FromDouble(3.14); // 创建一个 Python 浮点数对象
    double value = PyFloat_AsDouble(pyFloat);     // 从 Python 浮点数对象中获取值
    Py_DECREF(pyFloat);                           // 释放对象
    
  3. 字符串(str)

    PyObject* pyStr = PyUnicode_FromString("Hello, Python!"); // 创建一个 Python 字符串对象
    const char* value = PyUnicode_AsUTF8(pyStr);              // 从 Python 字符串对象中获取值
    Py_DECREF(pyStr);                                         // 释放对象
    
  4. 列表(list)

    PyObject* pyList = PyList_New(0); // 创建一个空的 Python 列表对象
    PyObject* pyInt = PyLong_FromLong(42);
    PyList_Append(pyList, pyInt);     // 向列表中添加元素
    Py_DECREF(pyInt);
    
    PyObject* item = PyList_GetItem(pyList, 0); // 获取列表中的元素
    long value = PyLong_AsLong(item);
    Py_DECREF(pyList); // 释放对象
    
  5. 字典(dict)

    PyObject* pyDict = PyDict_New(); // 创建一个空的 Python 字典对象
    PyObject* pyKey = PyUnicode_FromString("key");
    PyObject* pyValue = PyLong_FromLong(42);
    PyDict_SetItem(pyDict, pyKey, pyValue); // 向字典中添加键值对
    Py_DECREF(pyKey);
    Py_DECREF(pyValue);
    
    PyObject* value = PyDict_GetItemString(pyDict, "key"); // 获取字典中的值
    long intValue = PyLong_AsLong(value);
    Py_DECREF(pyDict); // 释放对象
    
  6. 元组(tuple)

    PyObject* pyTuple = PyTuple_New(2);   // 创建一个包含两个元素的 Python 元组对象
    PyObject* pyInt = PyLong_FromLong(42);
    PyObject* pyStr = PyUnicode_FromString("Hello");
    PyTuple_SetItem(pyTuple, 0, pyInt);  // 设置元组中的元素
    PyTuple_SetItem(pyTuple, 1, pyStr);
    
    PyObject* item = PyTuple_GetItem(pyTuple, 0); // 获取元组中的元素
    long value = PyLong_AsLong(item);
    Py_DECREF(pyTuple);  // 释放对象
    
  7. 布尔值(bool)

    PyObject* pyTrue = PyBool_FromLong(1);  // 创建一个 Python 布尔值对象 True
    PyObject* pyFalse = PyBool_FromLong(0); // 创建一个 Python 布尔值对象 False
    
    int isTrue = PyObject_IsTrue(pyTrue);   // 检查对象是否为 True
    int isFalse = PyObject_IsTrue(pyFalse); // 检查对象是否为 False
    Py_DECREF(pyTrue);                      // 释放对象
    Py_DECREF(pyFalse);                     // 释放对象
    
  8. 集合(set)

    PyObject* pySet = PySet_New(NULL);  // 创建一个空的 Python 集合对象
    PyObject* pyInt = PyLong_FromLong(42);
    PySet_Add(pySet, pyInt);            // 向集合中添加元素
    Py_DECREF(pyInt);
    
    int contains = PySet_Contains(pySet, pyInt);  // 检查集合中是否包含某个元素
    Py_DECREF(pySet);  // 释放对象
    
  9. 模块(module)

    // 设置 Python 模块路径
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append(\".\")"); // 将my_script模块路径添加到sys.path
    // 加载 Python 脚本
    PyObject *pName = PyUnicode_DecodeFSDefault("my_script"); // Python 脚本文件名
    PyObject *pModule = PyImport_Import(pName); // 导入模块
    
    Py_DECREF(pName);
    if (pModule == nullptr)
    {
        PyErr_Print();
    } 
    
  10. 函数(function)

    PyObject* pyFunc = PyObject_GetAttrString(pyModule, "function_name");  // 获取 Python 函数对象
    if (PyCallable_Check(pyFunc)) 
    {
        PyObject* pyArgs = PyTuple_New(1); // 创建元组 
        PyObject* pyValue = PyLong_FromLong(42);
        PyTuple_SetItem(pyArgs, 0, pyValue);
        PyObject* pyResult = PyObject_CallObject(pyFunc, pyArgs);  // 调用 Python 函数
        Py_DECREF(pyArgs);
        if (pyResult != NULL) 
        {
            long result = PyLong_AsLong(pyResult);
            Py_DECREF(pyResult);
        }
    }
    Py_DECREF(pyFunc);
    
  11. 类(class)和实例(instance)

    PyObject* pyClass = PyObject_GetAttrString(pyModule, "ClassName");  // 获取 Python 类对象
    if (PyCallable_Check(pyClass))
    {
        PyObject* pyInstance = PyObject_CallObject(pyClass, NULL);      // 获取 Python 类的实例
        if (pyInstance != NULL) 
        {
            PyObject* pyMethod = PyObject_GetAttrString(pyInstance, "method_name");  // 获取 Python 类的方法
            if (PyCallable_Check(pyMethod))
            {
                PyObject* pyArgs = PyTuple_New(1);
                PyObject* pyValue = PyLong_FromLong(42);
                PyTuple_SetItem(pyArgs, 0, pyValue);
                PyObject* pyResult = PyObject_CallObject(pyMethod, pyArgs);  // 调用实例方法
                Py_DECREF(pyArgs);
                if (pyResult != NULL) 
                {
                    long result = PyLong_AsLong(pyResult);
                    Py_DECREF(pyResult);
                }
            }
            Py_DECREF(pyMethod);
            Py_DECREF(pyInstance);
        }
    }
    Py_DECREF(pyClass);
    
  • 12
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt C++调用 Python 的方法,可以使用 Python 的 C/C++ API 或者使用第三方库,如 Boost.Pythonpybind11。这里提供使用 Python C/C++ API 的方法。 首先需要在 Qt C++ 项目中添加 Python 的头文件和库文件路径。在 .pro 文件中添加以下代码: ```pro INCLUDEPATH += /usr/include/python3.6m/ LIBS += -L/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu/ -lpython3.6m ``` 其中 `/usr/include/python3.6m/` 和 `/usr/lib/python3.6/config-3.6m-x86_64-linux-gnu/` 是 Python 的头文件和库文件路径,需要根据实际情况进行修改。 然后在 Qt C++调用 Python 的方法,可以按照以下步骤进行: 1. 初始化 Python 解释器: ```c++ Py_Initialize(); ``` 2. 导入 Python 模块: ```c++ PyObject* pModule = PyImport_ImportModule("module_name"); ``` 其中 `"module_name"` 是 Python 模块的名称。 3. 获取 Python 方法: ```c++ PyObject* pFunc = PyObject_GetAttrString(pModule, "function_name"); ``` 其中 `"function_name"` 是 Python 方法的名称。 4. 调用 Python 方法: ```c++ PyObject* pArgs = PyTuple_New(1); PyTuple_SetItem(pArgs, 0, Py_BuildValue("s", "argument")); PyObject* pResult = PyObject_CallObject(pFunc, pArgs); ``` 其中 `"argument"` 是传递给 Python 方法的参数。需要注意的是,在 Py_BuildValue 函数中需要指定参数类型,例如使用 `"s"` 表示字符串类型。 5. 处理 Python 方法的返回值: ```c++ char* result; PyArg_Parse(pResult, "s", &result); ``` 其中 `"s"` 表示返回值的类型为字符串类型。 6. 释放 Python 对象: ```c++ Py_DECREF(pArgs); Py_DECREF(pResult); Py_DECREF(pModule); ``` 最后,在程序结束时需要清理 Python 解释器: ```c++ Py_Finalize(); ``` 以上是基础的调用 Python 方法的步骤,具体实现还需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值