【问题标题】:How does Python call C?Python如何调用C?
【发布时间】:2018-07-15 11:05:38
【问题描述】:

Python 究竟如何调用 C 库?例如,我相信 Tensorflow 主要是用 C 编写的,但可以从 Python 中使用。我正在考虑用我自己的(解释的)编程语言(用 Go 编写,但我认为这将是一个类似的过程)实现类似的东西。

当 Python 程序调用 C 函数时会发生什么?我在考虑 RPC 或 DLL,但它们似乎都不太可能。

【问题讨论】:

  • 为什么不用 DLL?这正是正在发生的事情。见这里:docs.python.org/2/extending/extending.html
  • Python 语言? Python——解释器? Python——字节码解析器?在屏幕上做某事之前的某个地方,它不再是“Python”,而是一个程序调用另一个程序。
  • Python 的 C(和 C++)接口有据可查。

标签: python c dynamic-linking


【解决方案1】:

cPython 有两种调用 C 代码的主要方法:加载共享库并调用其符号,或者将 C 代码打包为 Python 二进制模块,然后从 Python 代码中调用它们,就像它们是普通的 Python 模块一样,这是标准库中的高性能东西是如何实现的——例如json

使用ctypes 模块加载共享库并从中调用函数相当简单,您可以在这里找到很多示例:https://docs.python.org/2/library/ctypes.html

将您的 C 代码打包为二进制 Python 模块需要大量样板文件并仔细注意引用计数、空指针等细节,并在此处记录:https://docs.python.org/2/extending/extending.html

有几个库可以自动执行该过程并为您生成绑定代码。一个例子是boost.pythonhttps://www.boost.org/doc/libs/1_65_0/libs/python/doc/html/tutorial/index.html

【讨论】:

  • 不,我不认为 json 是用 C 构建的,而是使用纯 Python 脚本
  • @Simon 哦,绝对是:github.com/python/cpython/blob/master/Modules/_json.c。您链接的 python 代码使用一些导入技巧来透明地加载它的 C 部分。
  • 好的。我的错。也许在您的答案中包含链接以避免将来的混淆:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 2020-02-18
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 2012-02-20
  • 2020-12-28
相关资源
最近更新 更多