如何编译整个Python库以及它的依赖项,以便它可以在C中使用(不调用Python的运行时)。也就是说,编译后的代码嵌入了Python解释器,不需要在系统上安装Python。
根据我的理解,当使用Cython编译Python代码时:
--embed
参数尚不清楚的问题是:
一个名为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语言重写。
答案 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或更新的东西。