OCaml和Python之间的通信

Mar*_*ark 6 python ocaml

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

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

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

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

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

有没有其他简单的方法来完成这种任务?

提前致谢.

ivg*_*ivg 8

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

  1. 什么交通工具?(文件,套接字等)
  2. 如何序列化和反序列化数据.

第一个问题很笼统.您可以使用不同类型的套接字,管道,共享内存,zmq库等等.这里很难给出任何建议,因为所有选择都有其缺点和优点.也许使用httpover TCPsocket不是一个糟糕的选择,因为它们无处不在,并且在管道的两侧都有优秀的库.另一种方法是使用管道,并使用popen系统调用调用一个或另一个部分,这将为您创建一个进程并返回您可以读取或写入的管道.作为以前的扩展,你甚至可以使用python用作库,并直接从您的ocaml程序调用解释器,并使用代码传递字符串.根据您的任务,它可能适合或不适合.

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

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


qsa*_*tos 2

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

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