OCaml与Python的通信
我想知道将数据从OCaml发送到Python并将Python的响应返回到OCaml的最佳方法 我能想到的一个天真的方法如下 1) 在OCaml中,将数据写入文件系统上的文件(input.txt) 2) 在OCaml中,运行python,它打开input.txt,读取数据并将执行结果写入output.txt 3) 在OCaml中,打开output.txt并读取结果 还有其他简单的方法来完成这类任务吗OCaml与Python的通信,python,ocaml,Python,Ocaml,我想知道将数据从OCaml发送到Python并将Python的响应返回到OCaml的最佳方法 我能想到的一个天真的方法如下 1) 在OCaml中,将数据写入文件系统上的文件(input.txt) 2) 在OCaml中,运行python,它打开input.txt,读取数据并将执行结果写入output.txt 3) 在OCaml中,打开output.txt并读取结果 还有其他简单的方法来完成这类任务吗 提前感谢。最简单的方法就是使用文件。您可以通过使用;在*nix系统上,无论如何都要将文件放入/tm
提前感谢。最简单的方法就是使用文件。您可以通过使用;在*nix系统上,无论如何都要将文件放入
/tmp/
中
另一个相对简单的选择是使用网络套接字。这是一个关于如何在两个用不同语言编写的程序之间进行对话的一般性问题。实际上,这个问题应该进一步细分为两个独立的子问题:
TCP
socket上使用http
不是一个坏的选择,因为它们无处不在,而且管道两侧都有优秀的库。另一种方法是使用管道,并使用popen
系统调用调用一个或另一个部分,这将为您创建一个进程,并返回可以读取或写入的管道。作为前面的扩展,您甚至可以使用python
作为库,直接从ocaml程序调用解释器,用代码传递字符串。根据您的任务,它可能是合适的,也可能不是
第二个问题是关于如何将OCaml原生类型(如int
)序列化为字节,然后将这些字节作为python原生int
类型读取,反之亦然。这里有一些解决方案,但不是很多。您可以在OCaml上使用json
和ezjsonm
库(在python上有一个json
),您可以使用cap'n'proto
它在OCaml和python中有绑定。此外,还有众所周知的Google协议缓冲区,也称为protobufs,在OCaml中有几个绑定,包括piqi
library,也可以序列化为多种格式
还有另一种方法,您可以使您的OCaml程序成为一个在
C
中公开接口的动态库,然后创建一个python模块,并将其直接调用为库。这不是很容易,因为它需要处理构建系统,所以我不建议在您有性能需求之前使用它 您可以使用。它允许您将OCaml代码打包为python扩展(可从python调用),反之亦然,因此您可以从OCaml调用python代码。使用文件不是一种好方法,因为它会产生更多问题,然后解决问题。尤其是同步。但是您可以使用python中的mmap
模块和Bigarray
的mmap
函数将文件映射到内存中,从而在两个不同进程之间创建共享内存。尽管如此,它在同步方面也存在问题。所以我建议使用一些流方法,比如管道、套接字等。看看python和ocaml中的amqp支持。它是一种消息传递协议,允许进程或线程轻松通信。其他选项是类似rpc的协议:corba、com、zeroc。每种语言都有两种语言的库(有些比其他更成熟)。但他们可能需要更多的学习才能让他们工作。无论如何,如果这不是你的最终目标,不要试图重新发明轮子:尽可能选择“现成”的解决方案,你会为你解决大多数问题(假设它得到很好的支持)。你可以使用