我想知道将数据从 OCaml 发送到 Python 并将响应从 Python 返回到 OCaml 的最佳方式。
我能想到的一种天真的方法如下。
1) 在 OCaml 中,将数据写入文件系统上的文件 (input.txt)。
2)在OCaml中,运行python,打开input.txt,读取数据,将执行结果写入output.txt
3) 在OCaml中,打开output.txt并读取结果
还有其他简单的方法可以完成此类任务吗?
提前致谢。
最佳答案
这是一个关于如何在两个用不同语言编写的程序之间进行对话的一般性问题。实际上,这个问题应该进一步分割为两个独立的子问题:
- 使用什么交通工具? (文件、套接字等)
- 如何序列化和反序列化数据。
第一个问题很笼统。您可以使用不同种类的套接字、管道、共享内存、zmq 库或其他任何东西。很难在这里给出任何建议,因为所有选择都有其优缺点。也许在 TCP
套接字上使用 http
是一个不错的选择,因为它们无处不在,并且管道两边都有优秀的库。另一种方法是使用管道,并使用 popen
系统调用调用一个或另一个部分,这将为您创建一个进程并返回您可以读取或写入的管道。作为前一个的扩展,您甚至可以将 python
用作库,并直接从您的 ocaml 程序调用解释器,传递带有代码的字符串。它可能适合也可能不适合,这取决于您的任务。
第二个问题,是关于如何将 OCaml 原生类型,如 int
序列化为字节,然后将此字节读取为 python 原生 int
类型,反之亦然。这里有一些解决方案,但不是很多。您可以在 OCaml 上使用 json
和 ezjsonm
库(在 python 上有一个 json
),您可以使用 cap'n' proto
它在 OCaml 和 Python 中有绑定(bind)。此外,还有众所周知的 Google Protocol Buffer ,又名 protobufs,在 OCaml 中有多个绑定(bind),包括 piqi
库,它也可以序列化为多种格式。
还有一种方法,你可以把你的OCaml程序做成一个在C
中暴露接口(interface)的动态库,然后创建一个python模块,直接作为库调用。这不是很容易,因为它需要弄乱构建系统,所以我不推荐它,除非你有性能要求。
关于python - OCaml 与 Python 之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27965967/