有一个长期运行的 Unix 进程,我希望用 Clojure 捕获和处理它的输出。repl-y / nREPL 会话就是这样一个过程的一个很好的例子:它的持续时间是不确定的,并且输出被打印到标准输出。
如果我尝试(clojure.java.io/sh "lein" "repl")
,评估将阻塞,直到底层过程完成,然后我可以观察输出。
这不是我想要的——我想立即获得一个流。
我可以使用 clojure.java.io 或类似的现有 Clojure 工具来实现这一点吗?否则不介意诉诸Java。
看看me.raynes.conch库,它比 clojure.java.shell 更通用一点。它的低级 API似乎正是您正在寻找的。
不是一个详细的答案,但Clojure函数的源代码sh
很短。如果您稍微修改它以删除.waitFor
(或添加一个高阶函数来消耗InputStreamReader
到达时返回的部分读取),您可能会在进程返回时获得更新的数据。但是要小心死锁,以防您的子进程也需要输入(如您的lein repl
示例中所示)。