python绑定,它是如何工作的?

时间:2012-04-18 03:20:58

标签: python c binding

我在探索python。我很好奇python绑定。有人可以解释一下,你怎么可以从Python访问C库。

2 个答案:

答案 0 :(得分:34)

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

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

其次,在CPython的情况下,有Python/C API。它可以用两种主要方式:

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

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

“Bindings”既可以使用ctypes作为纯Python库,也可以使用Python / C API作为动态链接库实现。第二个选项有时与SWIG之类的工具一起使用,通过生成“样板”代码或Boost.Python使得任务变得更容易,该代码在Python / C API制作之上提供C ++ API它更容易与C ++代码接口。

进一步阅读:Foreign Function Interface

答案 1 :(得分:9)

答案很简单,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中是不可扩展的,但是可以用Java扩展名为Jython的Python的Java实现,类似的.NET实现IronPython可以用.Net语言扩展。