在python中集成OCaml如何从python中保持ocml会话?

2024-07-03 07:04:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望PythonGUI在后台有一个OCaml进程。我希望在程序的整个生命周期中保持一个会话,并且根据用户的输入,调用一些OCaml命令并检索OCaml的输出。一些OCaml变量和结构可能会在这个过程中被定义,所以我想维护一个正在进行的会话。在

利用stocadin和stocat的解决方案保持水平。这对我来说纯粹是出于几个原因: 1我不知道OCaml计算是什么时候完成的,也不知道它的输出是完整的还是还有更多的输出(尤其是如果评估需要一些时间,以及是否调用了多个OCaml命令)。 2我没有固有的方法来判断OCaml命令是否运行顺利,或者是否存在OCaml警告或错误。 三。我失去了OCaml输出的结构。例如,如果输出分布在多行上,我无法判断哪些行由于行大小而断开,哪些行最初是单独的行。在

我知道对于将python与OCaml结合有一些讨论和一些包,但是它们都从OCaml运行python命令,而我需要的恰恰相反。在


Tags: 用户命令程序利用定义进程过程解决方案
3条回答

如果你想在一个单独的进程中运行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接口。在

系统的外观如下:

+     +   +   +   + -Thin Python wrapper / JS wrapper -+
|   Your   |   |      |   |  +                +  |
|  Python  |<->| gRPC |<->|  |        Your OCaml app          |  |
|   app    |   |      |   |  +                +  |
+     +   +   +   +                   +

p.S.我在一个类似于您的问题中使用相同的方法(但是GUI是用Java编写的)。我认为它非常方便,开发速度快,易于扩展。在

p.p.S.在这方面你并不孤单:)。这是一篇有趣的节选自a(前?)的论文谷歌员工(https://arxiv.org/abs/1702.01715):

Software engineers at Google are strongly encouraged to program in one of five officially-approved programming languages at Google: C++, Java, Python, Go, or JavaScript​.

Interoperation between these different programming languages is done mainly using Protocol Buffers​. Protocol Buffers is a way of encoding structured data in an efficient yet extensible way. It includes a domain-specific language for specifying structured data, together with a compiler that takes in such descriptions and generates code in C++, Java, Python, for constructing, accessing, serializing, and deserializing these objects. Google’s version of Protocol Buffers is integrated with Google’s RPC libraries, enabling simple cross-language RPCs, with serialization and deserialization of requests and responses handled automatically by the RPC framework.

作为补充说明,完全可以运行一个单独的顶层进程,并向其发送输入短语并读取相应的输出。检测顶级输出结尾的技巧是在每个输入短语之后添加一个保护短语:可以发送f ();; "end_of_input";;,然后观察对应于"end_of_input";;(又名- : string = "end_of_input")的顶层输出,而不是仅仅发送{}。从我的经验来看,最重要的一点就是错误的分析,而这只是我的经验。在

相关问题 更多 >