【发布时间】:2012-04-29 10:42:48
【问题描述】:
我正在探索 python。我对python绑定很好奇。谁能解释一下,您如何可以从 Python 访问 C 库。
【问题讨论】:
-
我建议您在 Google 上搜索“Python C 绑定”。
-
在 2017 年,这个问题是“Python C 绑定”的最高结果 :)
我正在探索 python。我对python绑定很好奇。谁能解释一下,您如何可以从 Python 访问 C 库。
【问题讨论】:
有几种方法可以从 Python 调用用 C 编写的代码。
首先,标准库中有ctypes 模块。它允许您直接从 Python 加载动态链接库(Windows 上的 DLL,Linux 上的共享库 .so)并从这些库中调用函数。此类库通常是用 C 编写的。
其次,如果是CPython,则有Python/C API。它可以用于两种主要方式:
可以用 C 语言编写动态链接库,使CPython 将其视为一个模块(您将能够在 Python 程序中导入它)。 Python/C API 允许库定义用 C 编写但仍可从 Python 调用的函数。该 API 非常强大,提供了操作所有 Python 数据类型和访问解释器内部的函数。
使用 C API 的第二种方法是将 Python 嵌入到用 C 编写的程序中。然后 C 程序能够创建用 C 编写的内置模块并公开 C 函数,就像在动态链接库中一样方法。 API 还允许程序执行脚本,然后可以导入和使用内置模块。这可用于创建基于 Python 的插件系统。
“绑定”既可以作为使用ctypes 的纯Python 库实现,也可以作为使用Python/C API 的动态链接库实现。第二个选项有时与SWIG 等工具一起使用,通过生成“样板”代码或Boost.Python 等工具使任务更容易,Boost.Python 在 Python/C API 之上提供 C++ API,使其更易于接口使用 C++ 代码。
【讨论】:
答案很简单,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 语言中扩展。
【讨论】: