我希望PythonGUI在后台有一个OCaml进程。我希望在程序的整个生命周期中保持一个会话,并且根据用户的输入,调用一些OCaml命令并检索OCaml的输出。一些OCaml变量和结构可能会在这个过程中被定义,所以我想维护一个正在进行的会话。在
利用stocadin和stocat的解决方案保持水平。这对我来说纯粹是出于几个原因: 1我不知道OCaml计算是什么时候完成的,也不知道它的输出是完整的还是还有更多的输出(尤其是如果评估需要一些时间,以及是否调用了多个OCaml命令)。 2我没有固有的方法来判断OCaml命令是否运行顺利,或者是否存在OCaml警告或错误。 三。我失去了OCaml输出的结构。例如,如果输出分布在多行上,我无法判断哪些行由于行大小而断开,哪些行最初是单独的行。在
我知道对于将python与OCaml结合有一些讨论和一些包,但是它们都从OCaml运行python命令,而我需要的恰恰相反。在
如果你想在一个单独的进程中运行OCaml,你需要将OCaml调用包装在一个函数中,该函数收集所有结果并以有用的序列化格式(例如JSON)返回它们。或者,您可以尝试编写一个使用OCaml toplevel as a library的PythonC扩展,但这可能是一个相当大的工作。在
如果您需要在Python和OCaml代码之间进行强大的通信,那么确实应该有两个独立的“主”进程(将它们视为网络节点)。在
正如@svenmarnach已经提到的,实现这一点的一个好选择是通过基于JSON的协议将这两个进程链接起来。在
更方便的方法是使用Google的gRPC框架(https://grpc.io/)并通过Protobuf消息(https://developers.google.com/protocol-buffers/)进行通信。这个框架非常简单。不幸的是,目前还没有对OCaml的支持,但我认为您可以将OCaml
main
精简为Python层,或者将其转换为JS。然后,您只需将您的函数连接到gRPC接口。在系统的外观如下:
p.S.我在一个类似于您的问题中使用相同的方法(但是GUI是用Java编写的)。我认为它非常方便,开发速度快,易于扩展。在
p.p.S.在这方面你并不孤单:)。这是一篇有趣的节选自a(前?)的论文谷歌员工(https://arxiv.org/abs/1702.01715):
作为补充说明,完全可以运行一个单独的顶层进程,并向其发送输入短语并读取相应的输出。检测顶级输出结尾的技巧是在每个输入短语之后添加一个保护短语:可以发送}。从我的经验来看,最重要的一点就是错误的分析,而这只是我的经验。在
f ();; "end_of_input";;
,然后观察对应于"end_of_input";;
(又名- : string = "end_of_input"
)的顶层输出,而不是仅仅发送{相关问题 更多 >
编程相关推荐