我希望python的后台有一个OCaml进程。我希望在程序的整个生命周期中保持一个会话,并根据用户的输入调用一些OCaml命令并检索OCaml的输出。在此过程中,可能会定义一些OCaml变量和结构,因此我想维护一个正在进行的会话。
我的解决方案是使用popen保存一个OCaml toplevel过程,并与它的stdin和stdout交互。这完全是出于以下几个原因: 1.我不知道OCaml计算是什么时候完成的,也不知道它的输出是否完成,或者还有更多的输出(尤其是如果计算需要一些时间,以及是否调用了多个OCaml命令)。2.我没有固有的方法来判断OCaml命令是否顺利运行,或者是否存在OCaml警告或错误。3.失去了OCaml输出的结构。例如,如果输出分散在多个行上,我就无法判断哪些行因行大小而中断,哪些原来是单独的行。
我知道有一些关于将python与OCaml结合在一起的讨论和包,但它们都是从OCaml运行python命令的,我需要的正好相反。
发布于 2017-08-03 09:19:59
如果要在单独的进程中运行OCaml,则需要将OCaml调用包装在一个收集所有结果并以有用的序列化格式(例如JSON )返回结果的函数中。或者,您可以尝试使用OCaml toplevel as a library编写Python扩展,但这可能是一项相当大的工作。
发布于 2017-08-03 10:27:34
如果您需要在Python和OCaml代码之间进行强有力的通信,那么确实应该有两个独立的“主”进程(将它们看作网络节点)。
正如@Sven Marnach已经提到的,实现这一点的一个很好的选择是通过基于JSON的协议将这两个进程连接起来。
更方便的方法是使用谷歌的gRPC框架(https://grpc.io/),并通过Protobuf (https://developers.google.com/protocol-buffers/)进行通信。这个框架非常巧妙。不幸的是,目前还没有对OCaml的支持,但我认为您可以将OCaml main瘦包装到瘦Python层,或者将其转换为JS。然后,只需将函数连接到gRPC接口即可。
以下是该系统的外观:
+----------+ +------+ +---Thin Python wrapper / JS wrapper---+
| Your | | | | +--------------------------------+ |
| Python |<->| gRPC |<->| | Your OCaml app | |
| app | | | | +--------------------------------+ |
+----------+ +------+ +--------------------------------------+P.S.我在一个类似于您的问题上使用了相同的方法(但GUI是用Java实现的)。我认为它非常方便,开发速度快,易于扩展。
P.P.S.你不是一个人在这里:)。这是一个有趣的摘录从一篇论文(前?)谷歌员工(https://arxiv.org/abs/1702.01715):
谷歌的软件工程师被强烈鼓励使用谷歌五种官方认可的编程语言之一进行编程: C++、Java、Python或JavaScript。 这些不同编程语言之间的互操作主要使用协议缓冲区进行。协议缓冲区是一种高效、可扩展的结构化数据编码方式。它包括一种特定于领域的语言,用于指定结构化数据,以及一个编译器,它接受这样的描述,并在C++、Java、Python中生成代码,用于构造、访问、序列化和反序列化这些对象。Google版本的协议缓冲区与Google的RPC库集成,支持简单的跨语言RPC,通过RPC框架自动处理请求和响应的序列化和反序列化。
发布于 2017-08-03 23:10:54
作为补充,完全有可能运行一个分离的toplevel过程,并将输入短语发送给它,并读取相应的输出。检测toplevel输出结束的诀窍是在每个输入短语之后添加一个保护短语:与其仅将f ();;发送到toplevel进程,还可以发送f ();; "end_of_input";;,然后监视与"end_of_input";; (又名- : string = "end_of_input")对应的toplevel输出。我的经验是,错误和警告通常很容易从toplevel输出中检测或解析;因此,唯一的缺失点是代码的格式。
https://stackoverflow.com/questions/45479510
复制相似问题