我想知道从OCaml向Python发送数据的最佳方法,并将Python的响应返回给OCaml。
我能想到的一种天真的方法如下。
1)在OCaml中,将数据写入文件系统上的文件(input.txt)。
2)在OCaml中,运行python,打开input.txt并读取数据并将执行结果写入output.txt
3)在OCaml中,打开output.txt并读取结果
还有其他简单的方法可以完成这项任务吗?
提前致谢。
答案 0 :(得分:8)
这是关于如何在两种程序之间进行对话的一般性问题,用不同语言编写。实际上,问题应进一步细分为两个独立的子问题:
第一个问题非常笼统。您可以使用不同类型的套接字,管道,共享内存,zmq库等等。这里很难给出任何建议,因为所有选择都有其缺点和优点。也许使用http
而不是TCP
套接字并不是一个糟糕的选择,因为它们无处不在,并且管道两侧都有优秀的库。另一种方法是使用管道,并使用popen
系统调用来调用一个或另一个部分,这将为您创建一个进程并返回可以读取或写入的管道。作为前一个的扩展,您甚至可以使用python
作为库,并直接从您的ocaml程序调用解释器,并使用代码传递字符串。根据您的任务,它可能适合与否。
第二个问题是关于如何将OCaml本机类型(如int
)序列化为字节,然后将此字节读取为python native int
类型,反之亦然。这里有一些解决方案,但不是很多。您可以在OCaml上使用json
和ezjsonm
库(在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代码。