在 Qt C++ 中调用 Python 时,可以通过 PyObject
获取和操作各种 Python 对象。以下是一些常见的 Python 对象类型及其对应的 PyObject
操作:
-
整数(int):
PyObject* pyInt = PyLong_FromLong(42); // 创建一个 Python 整数对象 long value = PyLong_AsLong(pyInt); // 从 Python 整数对象中获取值 Py_DECREF(pyInt); // 释放对象
-
浮点数(float):
PyObject* pyFloat = PyFloat_FromDouble(3.14); // 创建一个 Python 浮点数对象 double value = PyFloat_AsDouble(pyFloat); // 从 Python 浮点数对象中获取值 Py_DECREF(pyFloat); // 释放对象
-
字符串(str):
PyObject* pyStr = PyUnicode_FromString("Hello, Python!"); // 创建一个 Python 字符串对象 const char* value = PyUnicode_AsUTF8(pyStr); // 从 Python 字符串对象中获取值 Py_DECREF(pyStr); // 释放对象
-
列表(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); // 释放对象
-
字典(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); // 释放对象
-
元组(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); // 释放对象
-
布尔值(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); // 释放对象
-
集合(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); // 释放对象
-
模块(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(); }
-
函数(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);
-
类(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);