OCaml与Python的通信

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

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

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

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

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

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

还有其他简单的方法来完成这类任务吗


提前感谢。

最简单的方法就是使用文件。您可以通过使用;在*nix系统上,无论如何都要将文件放入
/tmp/


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

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

  • 使用什么交通工具?(文件、套接字等)
  • 如何序列化和反序列化数据
  • 第一个问题非常笼统。您可以使用不同类型的套接字、管道、共享内存、zmq库或其他任何东西。这里很难给出任何建议,因为所有的选择都有其利弊。也许在
    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。每种语言都有两种语言的库(有些比其他更成熟)。但他们可能需要更多的学习才能让他们工作。无论如何,如果这不是你的最终目标,不要试图重新发明轮子:尽可能选择“现成”的解决方案,你会为你解决大多数问题(假设它得到很好的支持)。你可以使用