55

我正在探索python。我对python绑定很好奇。任何人都可以解释一下,您如何可以从 Python 访问 C 库。

4

2 回答 2

62

有几种方法可以从 Python 调用用 C 编写的代码。

首先,标准库中有ctypes模块。.so它允许您直接从 Python加载动态链接库(Windows 上的 DLL,Linux 上的共享库)并从这些库中调用函数。这样的库通常是用 C 编写的。

其次,如果CPythonPython/C API。它可以以两种主要方式使用:

可以用 C 语言编写动态链接库,CPython将其视为模块(您可以将其导入 Python 程序)。Python/C API 允许库定义用 C 编写但仍可从 Python 调用的函数。API 非常强大,提供了操作所有 Python 数据类型和访问解释器内部的函数。

使用 C API 的第二种方法是将 Python 嵌入到用 C 编写的程序中。然后 C 程序能够创建用 C 编写的内置模块并公开 C 函数,就像在动态链接库方法中一样。API 还允许程序执行脚本,然后可以导入和使用内置模块。这可用于创建基于 Python 的插件系统。

“绑定”既可以使用纯 Python 库实现,也可以ctypes使用 Python/C API 实现为动态链接库。第二个选项有时与SWIG之类的工具一起使用,它通过处理生成“样板”代码或Boost.Python来简化任务,它在 Python/C API 之上提供 C++ API,从而更容易与 C++ 交互代码。

进一步阅读:外部函数接口

于 2012-04-18T03:59:47.490 回答
16

答案很简单,python (CPython) 解释器是用 C 编写的,它可以动态调用其他 C 库,您的 C 扩展模块或嵌入式 C 代码可以很容易地从任何其他 C 代码中调用。

CPython 允许特殊的钩子,以便它可以调用其他 C 代码或从其他 C 代码调用。它甚至不需要是 C,任何编译为本机代码并具有相同调用约定的语言。

对于一个简单的案例,考虑创建一个名为 mython 的程序,它可以加载任何共享库并尝试调用一个函数,run例如

lib = dlopen("mylib.so", RTLD_LAZY);
func = dlsym(lib, "run");
(*func)();

因此,在您加载模块并调用其代码的方式中,CPython 会以更复杂的方式执行此操作,提供更好的接口和对象来传递,此外还涉及内存管理、线程管理等其他复杂问题。

因此,Python 实现的平台必须与它被扩展的语言相匹配,例如 CPython 在 Java 中不可扩展,但称为Jython的 Python 的 Java 实现可以在 Java 中扩展,类似的 .NET 实现IronPython可以在 .Net 语言中扩展。

于 2012-04-18T03:31:59.610 回答