python - OCaml 与 Python 之间的通信

标签 python ocaml

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

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

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

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

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

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

提前致谢。

最佳答案

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

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

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

第二个问题,是关于如何将 OCaml 原生类型,如 int 序列化为字节,然后将此字节读取为 python 原生 int 类型,反之亦然。这里有一些解决方案,但不是很多。您可以在 OCaml 上使用 jsonezjsonm 库(在 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/

相关文章:

OCaml - GADT - bool 表达式

ocaml - 类型级算术 : "at most" nat or nat interval

python - 检查字符串中的最后一个匹配字符

python - 默认切片索引 *真的* 是什么?

python - 如何在 python 中找到调用函数的类?

asynchronous - 在 Ocaml Async 中的延迟计算中使用 return

exception - 为什么按下numlock会使OCaml opengl程序崩溃?

python - 更改 tensorflow 中张量的比例

python - 如何向整个 pandas 数据框添加或减去一行?

expression - 奥卡姆 : multiply expression (*) int int -> int