How to compile a whole Python library along with it's dependencies so that it can be used in C (without invoking Python's runtime).
这是不可能的。Python代码实际上应该运行在Python解释器上。在
有时,当Python只使用了一小部分Python(甚至是Python代码使用的所有代码都间接使用了间接地),您可能会使用Cython(这实际上是Python的一个小子集的超集:许多真正的Python特性不能从Cython中使用,或者使用Python解释器)。但是并不是每一个Python代码都可以被cythonized,因为Python和C有一个非常不同(而且不兼容)semantics(和memory management)。在
否则(通常情况下),使用Python内容的C代码应该embed the Python interpreter。在
如果您的目标是让一个自给自足的C库可以从许多C程序(在没有Python的系统上)使用,那么一个更明智、更健壮的方法是用C重写代码。在
您还可以考虑(在C库中)启动一些Python进程(类似服务器,执行Python的工作)并使用inter-process communication工具,这将是操作系统特有的。当然,Python需要使用库安装在应用程序的系统上。例如,对于Linux,您可以在库中派生一些Python进程,并使用pipe(7)或{a7}套接字从C库通信到该进程(可能使用类似JSONRPC)的东西。在
您的编辑(仍然不是MCVE)显示了一些用Python完成的HTTP交互。您可以考虑在C中使用HTTP客户机库(如libcurl)或(如果需要)HTTP服务器库(如libonion)的帮助,在C中实现这一点。在
所以考虑用C重写你的东西,但是要使用几个现有的C库(如何选择和选择什么是一个非常不同的问题,可能是off-topic on StackOverflow)。否则,接受Python的依赖关系。在The actual use case is collecting/processing robotics data in C at a high sampling rate. Whilst C is great for basic data processing there are excellent Python libraries which allow for much more comprehensive analysis.
您可以在Python中保留高级的东西(参见this),但是用C重新编码低层次的东西以加速它们(许多软件都在这样做,例如TensorFlow,…),可能是extensions in C for Python或其他进程。当然,这意味着一些开发工作。如果在Python中使用大量代码,我认为完全避免Python是不合理的(完全摆脱Python是不实际的)。顺便说一句,你可能会考虑在你的C应用程序中嵌入一些其他语言(例如Lua、Guile、Ocaml——据说它们都比Python快),并让Python保持更高的水平,在其他进程中运行。在
你需要把更多的精力放在你的东西的建筑设计上。我不确定完全避免使用Python是否明智。混合使用Python和C(也许通过让几个进程协同工作)可能更明智。当然,您将拥有操作系统特定的东西(特别是在C端,用于进程间通信)。如果在Linux上,请阅读一些关于用C编写Linux系统编程的文章,例如ALP或更新的东西。在