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

Posted

技术标签:

【中文标题】python绑定,它是如何工作的?【英文标题】:python bindings, how does it work? 【发布时间】:2012-04-29 10:42:48 【问题描述】:

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

【问题讨论】:

我建议您在 Google 上搜索“Python C 绑定”。 在 2017 年,这个问题是“Python C 绑定”的最高结果 :) 【参考方案1】:

有几种方法可以从 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++ 代码。

进一步阅读:Foreign Function Interface

【讨论】:

有人可以提供一些演示代码或 repo 来模拟它以最简单的形式实际工作的方式吗?那真的很有帮助。【参考方案2】:

答案很简单,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 语言中扩展。

【讨论】:

很多东西是用 C 写的。但是很多用 C 写的东西不能用 C 扩展。是什么让 Python 与众不同? @Anurag python 不能扩展到 Java 是否正确? @ahim :CPython 是 Python 的 C 实现。 JPython,其中Python解释器是用Java实现的,可以用来调用Java代码。

以上是关于python绑定,它是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

python pty.fork - 它是如何工作的

WCF NetTcpBinding 安全性 - 它是如何工作的?

Python 中最短的数独求解器 - 它是如何工作的?

preprocessing.scale() 做啥?它是如何工作的?

如何绑定到组件内的全局变量?

绑定适配器无法正常工作