Python 与 C 的互相调用
1. 引言
Python 是一门简单易学、功能强大的编程语言,而 C 语言是一种底层的、高性能的编程语言。在某些场景下,我们可能需要使用到 C 语言的高性能特性,但是又想充分发挥 Python 的便捷与简洁。这时,我们可以借助 Python 与 C 语言之间的互相调用来实现这一需求。
在本文中,我们将详细介绍如何使用 Python 与 C 语言进行互相调用。首先,我们将介绍如何从 Python 调用 C 语言的函数;接着我们将讨论如何从 C 语言调用 Python 的函数。最后,我们将通过具体的示例代码来说明这些概念的应用。
2. 从 Python 调用 C 语言函数
Python 提供了一个名为 ctypes
的标准库,可以用来与 C 语言进行交互。使用 ctypes
,我们可以轻松地将 C 语言的函数导入到 Python 中,并在 Python 中调用这些函数。
下面是一个简单的示例代码,展示了如何从 Python 中调用 C 语言的函数:
import ctypes
# 加载动态链接库
lib_example = ctypes.CDLL('./example.so')
# 导入 C 函数
add_numbers = lib_example.add_numbers
add_numbers.restype = ctypes.c_int
add_numbers.argtypes = [ctypes.c_int, ctypes.c_int]
# 调用 C 函数
result = add_numbers(3, 4)
print(result)
上面的示例代码中,我们首先使用 ctypes.CDLL
函数加载了一个动态链接库(通常是由 C 语言编写的)。然后,我们通过 lib_example
对象来导入 C 函数 add_numbers
。在导入函数后,我们还可以指定函数的返回值类型和参数类型。
在调用函数时,我们直接像调用 Python 函数一样调用 C 函数,并传入适当的参数。最后,我们通过打印出结果来验证 C 函数的调用。
需要注意的是,这里使用的是 example.so
文件,这是一个编译好的 C 语言动态链接库文件。你可以使用一个 C 编译器(比如 gcc)将 C 语言源码编译成动态链接库。这超过了本文的范围,所以这里不再展开。
3. 从 C 语言调用 Python 函数
与从 Python 调用 C 函数类似,我们也可以从 C 语言中调用 Python 函数。为此,Python 提供了一个名为 Python/C API
的接口,它允许我们以 C 语言的方式调用 Python 函数。
下面是一个示例的 C 程序,展示了如何从 C 语言中调用 Python 函数:
#include <Python.h>
int main() {
// 初始化 Python 解释器
Py_Initialize();
// 导入 Python 模块
PyObject* my_module = PyImport_ImportModule("my_module");
// 导入 Python 函数
PyObject* my_function = PyObject_GetAttrString(my_module, "my_function");
// 准备函数参数
PyObject* args = PyTuple_Pack(2, PyLong_FromLong(3), PyLong_FromLong(4));
// 调用 Python 函数
PyObject* result = PyObject_CallObject(my_function, args);
// 获取函数返回值
long ret = PyLong_AsLong(result);
// 打印结果
printf("%ld\n", ret);
// 清理资源
Py_DECREF(my_module);
Py_DECREF(my_function);
Py_DECREF(args);
Py_DECREF(result);
// 释放 Python 解释器
Py_Finalize();
return 0;
}
上述示例代码中,我们首先使用 Py_Initialize
函数初始化了 Python 解释器。然后,我们使用 PyImport_ImportModule
导入了一个名为 my_module
的 Python 模块。之后,我们通过 PyObject_GetAttrString
导入了模块中的一个名为 my_function
的 Python 函数。
在准备好调用函数时,我们使用 PyTuple_Pack
函数来准备函数参数。接着,我们使用 PyObject_CallObject
函数调用了 Python 函数,并获取了返回值。
最后,我们在 C 程序中打印出了 Python 函数的返回值,并在程序结束前进行了资源的清理。
需要注意的是,为了能够在 C 语言中调用 Python 函数,我们需要包含 <Python.h>
头文件,并链接 Python 的库。关于如何编译上述示例代码,请参考 Python 的官方文档或其他相关资源。
4. 示例代码运行结果
下面我们将展示一个示例代码的运行结果,以说明 Python 与 C 语言的互相调用。
假设我们有一个 C 语言函数 add_numbers
,它可以将两个整数相加。我们希望调用这个 C 函数并打印出结果。
首先,我们需要编写一个名为 example.c
的 C 源码文件:
int add_numbers(int a, int b) {
return a + b;
}
然后,我们使用以下命令将 C 源码编译为动态链接库:
gcc -shared -o example.so example.c
接下来,我们编写一个 Python 脚本 example.py
,用于调用上述的 C 函数:
import ctypes
lib_example = ctypes.CDLL('./example.so')
add_numbers = lib_example.add_numbers
add_numbers.restype = ctypes.c_int
add_numbers.argtypes = [ctypes.c_int, ctypes.c_int]
result = add_numbers(3, 4)
print(result)
最后,我们在命令行中运行这个 Python 脚本:
python example.py
输出结果应该为:
7
5. 结论
Python 与 C 的互相调用可以让我们在高性能的 C 代码和简洁方便的 Python 代码之间取得平衡。通过 ctypes
和 Python/C API
,我们可以实现跨语言的函数调用,从而充分发挥两者的优点。
在本文中,我们介绍了从 Python 调用 C 函数和从 C 调用 Python 函数的方法,并给出了相应的示例代码。