在 OCaml 中,如何从子进程中获取标准输出字符串?
In OCaml, how to get stdout string from subprocess?
我正在使用 OCaml,需要启动一个新进程并与之通信。
如果子进程在调用并产生一些输出后终止,那么如何检索它的标准输出中的字符串?
如果子进程永远不会终止怎么办?也就是说,每次给stdin一个字符串,它都会产生一个结果到stdout,如何获取结果?
使用Unix.open_process_in
函数。它将产生一个进程和 return 一个输入通道,这将允许您从进程中读取数据。
如果要等待进程终止,可以只读取所有数据(即等到进程管道returns EOF),然后关闭通道,例如
(* [run cmd] runs a shell command, waits until it terminates, and
returns a list of strings that the process outputed *)
let run cmd =
let inp = Unix.open_process_in cmd in
let r = In_channel.input_lines inp in
In_channel.close inp; r
使用非终止进程更容易。
您可能还会发现有趣的 lwt 库,它具有非常好的多处理接口。异步库是另一个异步库,它为多处理提供了一个很好的接口。尽管这个库很棒,但它们有点先进,对于简单的情况,标准 Unix
模块就足够了。
我正在使用 OCaml,需要启动一个新进程并与之通信。
如果子进程在调用并产生一些输出后终止,那么如何检索它的标准输出中的字符串?
如果子进程永远不会终止怎么办?也就是说,每次给stdin一个字符串,它都会产生一个结果到stdout,如何获取结果?
使用Unix.open_process_in
函数。它将产生一个进程和 return 一个输入通道,这将允许您从进程中读取数据。
如果要等待进程终止,可以只读取所有数据(即等到进程管道returns EOF),然后关闭通道,例如
(* [run cmd] runs a shell command, waits until it terminates, and
returns a list of strings that the process outputed *)
let run cmd =
let inp = Unix.open_process_in cmd in
let r = In_channel.input_lines inp in
In_channel.close inp; r
使用非终止进程更容易。
您可能还会发现有趣的 lwt 库,它具有非常好的多处理接口。异步库是另一个异步库,它为多处理提供了一个很好的接口。尽管这个库很棒,但它们有点先进,对于简单的情况,标准 Unix
模块就足够了。