📜  从 C 调用Python |设置 2(1)

📅  最后修改于: 2023-12-03 15:36:12.999000             🧑  作者: Mango

从 C 调用 Python | 设置 2

从 C 调用 Python | 设置 1 中,我们学习了如何在 C 语言中调用 Python,并且了解了 Python 中的 Py_BuildValue() 函数和 PyArg_ParseTuple() 函数。本篇文章将带领大家更进一步,学习更多 Python/C API 中常用的函数,以实现更复杂的 C 与 Python 互联。

一. Python/C API 常用函数

下面是一些常用的 Python/C API 函数,这些函数可以帮助我们在 C 语言中很方便地调用 Python。

  • PyObject* Py_BuildValue(const char *format, ...): 构建 Python 对象,类似于 Python 中的 return 语句。
  • int PyArg_ParseTuple(PyObject *args, const char *format, ...): 从一个 PyObject 类型的元组中解析参数,类似于 Python 中的参数解析符。
  • PyObject* PyImport_Import(PyObject *name): 导入一模块,类似于 Python 中 import 语句。
  • PyObject* PyObject_GetAttrString(PyObject *o, const char *attr_name): 获取一个对象的属性,类似于 Python 中的 o.attr_name
  • int PyObject_SetAttrString(PyObject *o, const char *attr_name, PyObject *v): 设置一个对象的属性,类似于 Python 中的 o.attr_name = v
  • PyObject* PyObject_Call(PyObject *callable_object, PyObject *args, PyObject *kw): 调用一个对象,类似于 Python 中的函数调用。
二. 调用 Python 模块中的函数

在我们学习了上面所述的 Python/C API 函数后,我们来实践一下在 C 语言中如何调用 Python 模块中的函数。

首先,我们需要创建一个 Python 模块。我们创建一个名为 testmodule 的模块,创建成功后,在 testmodule.py 中编写一个 testfunc() 函数:

# testmodule.py

def testfunc(a, b):
    return a + b

然后,我们就可以使用下面的 C 代码调用 testfunc() 函数:

#include <Python.h>
int main(int argc, char *argv[]) {
    PyObject *pModule = NULL, *pFunc = NULL, *pArgs = NULL, *pRet = NULL;

    /* 初始化 Python 环境 */
    Py_Initialize();

    /* 导入 testmodule 模块 */
    pModule = PyImport_ImportModule("testmodule");
    if (!pModule) {
        printf("can't load module!\n");
        return -1;
    }

    /* 查找 testfunc 函数 */
    pFunc = PyObject_GetAttrString(pModule, "testfunc");

    /* 创建参数 */
    pArgs = Py_BuildValue("(ii)", 1, 2);

    /* 调用函数 */
    pRet = PyObject_CallObject(pFunc, pArgs);

    /* 获取返回值 */
    int result;
    PyArg_Parse(pRet, "i", &result);

    printf("%d\n", result); /* 输出 3 */

    /* 释放垃圾回收机制 */
    Py_DECREF(pArgs);
    Py_DECREF(pRet);
    Py_DECREF(pFunc);
    Py_DECREF(pModule);

    /* 销毁 Python 环境 */
    Py_Finalize();

    return 0;
}

代码解析:

  1. 通过 PyImport_ImportModule() 函数导入 testmodule 模块
  2. 使用 PyObject_GetAttrString() 函数获取 testfunc 函数
  3. 使用 Py_BuildValue() 函数构建参数,并使用 PyObject_CallObject() 函数调用函数
  4. 使用 PyArg_Parse() 函数从返回值中解析出结果
  5. 释放垃圾回收机制并销毁 Python 环境

这样,我们就成功地在 C 语言中调用了 Python 模块中的函数。