📅  最后修改于: 2023-12-03 15:36:12.999000             🧑  作者: Mango
在 从 C 调用 Python | 设置 1 中,我们学习了如何在 C 语言中调用 Python,并且了解了 Python 中的 Py_BuildValue()
函数和 PyArg_ParseTuple()
函数。本篇文章将带领大家更进一步,学习更多 Python/C API 中常用的函数,以实现更复杂的 C 与 Python 互联。
下面是一些常用的 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/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;
}
代码解析:
PyImport_ImportModule()
函数导入 testmodule
模块PyObject_GetAttrString()
函数获取 testfunc
函数Py_BuildValue()
函数构建参数,并使用 PyObject_CallObject()
函数调用函数PyArg_Parse()
函数从返回值中解析出结果这样,我们就成功地在 C 语言中调用了 Python 模块中的函数。