OCaml和Python之间的通信

6
我想知道从OCaml向Python发送数据并获取Python响应的最佳方法。
我可以想到一个比较朴素的方法:
1)在OCaml中,将数据写入文件系统上的一个文件(input.txt)中。
2)在OCaml中,运行Python,Python打开input.txt读取数据并将执行结果写入output.txt。
3)在OCaml中,打开output.txt并读取结果。
是否有其他更简单的方法来完成这种任务呢?
提前感谢。

1
使用文件不是一个好的方法,因为它会产生更多的问题而不是解决问题。特别是在同步方面。但是你可以使用Python中的mmap模块和Bigarraymmap函数将文件映射到内存中,从而在两个不同的进程之间创建共享内存。虽然这种方法也存在同步问题。因此,我建议使用一些流式方法,比如管道、套接字等。 - ivg
请查看Python和OCaml中的AMQP支持。这是一种消息传递协议,可以让进程或线程轻松通信。 - didierc
其他选项是像RPC协议一样的协议:CORBA、COM、ZeroC。每个协议都有针对两种语言的库(有些比其他的更成熟)。但是它们可能需要更多的学习才能让它们正常工作。 - didierc
无论如何,如果这不是你的最终目标,请不要试图重新发明轮子:尽可能选择“现成”的解决方案,你会得到大多数问题的解决(假设它得到了良好的支持)。 - didierc
您可以使用 Pycaml 在同一进程中运行它们。 - Yann Vernier
3个回答

8
这是一个关于如何在不同编程语言编写的两个程序之间进行通信的一般性问题。实际上,该问题应进一步分为两个不同的子问题:
  1. 使用什么传输方式?(文件、套接字等)
  2. 如何序列化和反序列化数据。
第一个问题非常一般化。可以使用不同类型的套接字、管道、共享内存、zmq库等。很难在这里给出任何建议,因为所有选择都有其优缺点。也许使用TCP套接字上的http不是一个坏选择,因为它们无处不在,并且在管道的两端都有优秀的库。另一种方法是使用管道,并使用popen系统调用调用一个或另一个部分,它将为您创建一个进程并返回管道,您可以从中读取或写入。作为前面的扩展,您甚至可以将python作为库使用,并直接从ocaml程序调用解释器,传递包含代码的字符串。根据您的任务,它可能合适或不合适。
第二个问题是关于如何将OCaml本地类型(例如int)序列化为字节,然后将这些字节读取为python本地的int类型,反之亦然。这里有一些解决方案,虽然不是很多。您可以在OCaml上使用ezjsonm库的json(在python中有一个json),也可以使用cap'n'proto。它在OCaml和Python中都有绑定。此外,Google Protocol缓冲区(protobufs)是众所周知的,包括piqi库在内的OCaml中有几个绑定,还可以序列化为许多格式。
还有另一种方法,您可以使OCaml程序成为公开接口的动态库,在C中创建一个python模块,并直接调用它作为库。这不是非常容易,因为它需要与构建系统混合在一起,因此我不建议在没有性能要求的情况下这样做。

3
您可以使用 PyCaml。它允许您将OCaml代码打包为Python扩展(可从Python调用),反之亦然,因此您可以从OCAML调用Python代码。

2

最简单的方法是使用文件。您可以通过使用命名管道来避免写入磁盘;在*nix系统上,无论如何都将文件放在/tmp/中。

另一个相对简单的选择是使用网络套接字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接