OCaml和Python之间的通信

时间:2015-01-15 14:44:49

标签: python ocaml

我想知道从OCaml向Python发送数据的最佳方法,并将Python的响应返回给OCaml。

我能想到的一种天真的方法如下。

1)在OCaml中,将数据写入文件系统上的文件(input.txt)。

2)在OCaml中,运行python,打开input.txt并读取数据并将执行结果写入output.txt

3)在OCaml中,打开output.txt并读取结果

还有其他简单的方法可以完成这项任务吗?

提前致谢。

3 个答案:

答案 0 :(得分:8)

这是关于如何在两种程序之间进行对话的一般性问题,用不同语言编写。实际上,问题应进一步细分为两个独立的子问题:

  1. 使用什么交通工具? (文件,套接字等)
  2. 如何序列化和反序列化数据。
  3. 第一个问题非常笼统。您可以使用不同类型的套接字,管道,共享内存,zmq库等等。这里很难给出任何建议,因为所有选择都有其缺点和优点。也许使用http而不是TCP套接字并不是一个糟糕的选择,因为它们无处不在,并且管道两侧都有优秀的库。另一种方法是使用管道,并使用popen系统调用来调用一个或另一个部分,这将为您创建一个进程并返回可以读取或写入的管道。作为前一个的扩展,您甚至可以使用python作为库,并直接从您的ocaml程序调用解释器,并使用代码传递字符串。根据您的任务,它可能适合与否。

    第二个问题是关于如何将OCaml本机类型(如int)序列化为字节,然后将此字节读取为python native int类型,反之亦然。这里有一些解决方案,但不是很多。您可以在OCaml上使用jsonezjsonm库(在python上有一个json),您可以使用它在OCaml和Python中绑定的cap'n'proto。此外,还有众所周知的Google协议缓冲区,即protobufs,在OCaml中有几个绑定,包括piqi库,它们也可以序列化为多种格式。

    还有另一种方法,你可以让OCaml程序成为C中的动态库公开接口,然后创建一个python模块,并直接将其作为库调用。这不是很容易,因为它需要弄乱构建系统,所以在你有性能要求之前我不推荐它。

答案 1 :(得分:2)

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

一个相对简单的替代方案是使用网络套接字。

答案 2 :(得分:2)

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