如何编译整个Python库(包括依赖项)以便它可以在C中使用?

时间:2018-05-04 04:38:53

标签: python cython cythonize

如何编译整个Python库以及它的依赖项,以便它可以在C中使用(不调用Python的运行时)。也就是说,编译后的代码嵌入了Python解释器,不需要在系统上安装Python。

根据我的理解,当使用Cython编译Python代码时:

  • 如果使用--embed参数
  • ,则不调用python运行时
  • 单独编译文件
  • 允许调用不同的模块(来自Python运行时/其他已编译的Cython文件)

尚不清楚的问题是:

  • 如何使用C中的这些模块文件?当在C?
  • 中使用时,编译的Python文件是否可以调用其他已编译的Python文件
  • 是否只需要声明库入口点或者是否需要声明所有函数?
  • 如何管理Python依赖项?如何编译它们(这样就不需要Python运行时)。

一个名为module的python库的简化示例,其中__init__.py是一个空文件:

module/
├── run.py
├── http/
│   ├── __init__.py
│   ├── http_request.py

http_requests.py包含:

import requests

def get_ip():
    r = requests.get('https://ipinfo.io/ip')
    print(r.text)

run.py包含以下内容:

from http import http_request

if __name__ == '__main__':
    http_request.get_ip()

如何在不使用Python运行时从C调用函数get_ip(在运行应用程序时需要安装Python)。

以上示例非常简单。实际使用案例是以高采样率在C中收集/处理机器人数据。虽然C非常适合基本数据处理,但是有很好的Python库可以进行更全面的分析。目标是在C语言中部分处理的数据上调用Python库。这将使我们能够更加详细地了解数据(并在“实时”中处理它)。数据框架太大,我们的团队无法用C语言重写。

1 个答案:

答案 0 :(得分:2)

  

如何编译整个Python库以及它的依赖关系,以便它可以在C中使用(不调用Python的运行时)。

这是不可能的。实际上,Python代码可以在Python解释器上运行。

有时,当只使用一小部分Python时(即使间接你的Python代码正在使用的所有内容),你可以使用Cython(实际上是一个小子集的超集) Python:许多真正的Python功能不能从Cython使用,或使用Python解释器)。但并不是每个Python代码都可以进行cython化,因为Python和C有一个非常不同(且不兼容)semantics(和memory management)。

否则(通常),使用Python内容的C代码应为embed the Python interpreter

更聪明,更强大的方法,如果您的目标是使许多C程序(在没有Python的系统上)可以使用自给自足的C库,那么用C 重写您的代码。

你也可以考虑启动(在你的C库中)一些Python进程(像服务器一样,做你的Python工作)和使用inter-process communication工具,这将是特定于操作系统的。当然,Python需要使用您的库安装在应用程序的系统上。例如,对于Linux,您可以在库中分叉一些Python进程,并使用pipe(7)unix(7)套接字从C库到该进程的通信(可能使用JSONRPC之类的东西)

您的编辑(仍然不是MCVE)显示了在Python中完成的一些HTTP交互。您可以考虑使用C中的HTTP客户端库(如libcurl)或(如果需要)HTTP服务器库(如libonion)来在C中执行此操作。

所以考虑用C语言重写你的东西,但是使用几个现有的 C库(如何以及选择什么是一个非常不同的问题,可能是off-topic on StackOverflow)。否则,接受Python上的依赖项。

  

实际使用案例是以高采样率收集/处理C中的机器人数据。虽然C非常适合基本数据处理,但是有很好的Python库可以进行更全面的分析。

你可以在Python中保留高级内容(参见this),但在C中重新编写低级内容以加速它们(许多软件正在这样做,例如TensorFlow,......),也许是{{3或者在其他一些过程中。当然,这意味着一些发展努力。如果你在Python中使用大量代码,我不认为完全避免Python是合理的(完全摆脱Python不是实用的)。顺便说一句,你可能会考虑在你的C应用程序中嵌入一些其他语言(例如Lua,Guile,Ocaml--据说它们都比Python更快)并将Python保持在更高级别,在其他一些进程中运行。

你需要在你的东西的建筑设计上投入更多的精力。我不确定完全避免使用Python是明智之举。混合Python和C(可能通过让几个进程协作)可能更明智。当然,您将拥有特定于操作系统的内容(特别是在C端,用于进程间通信)。如果在Linux上,请阅读C中的Linux系统编程,例如: extensions in C for Python或更新的东西。