4

有一个长期运行的 Unix 进程,我希望用 Clojure 捕获和处理它的输出。repl-y / nREPL 会话就是这样一个过程的一个很好的例子:它的持续时间是不确定的,并且输出被打印到标准输出。

如果我尝试(clojure.java.io/sh "lein" "repl"),评估将阻塞,直到底层过程完成,然后我可以观察输出。

这不是我想要的——我想立即获得一个流。

我可以使用 clojure.java.io 或类似的现有 Clojure 工具来实现这一点吗?否则不介意诉诸Java。

4

2 回答 2

3

看看me.raynes.conch库,它比 clojure.java.shell 更通用一点。它的低级 API似乎正是您正在寻找的。

于 2013-06-04T13:43:45.267 回答
2

不是一个详细的答案,但Clojure函数的源代码sh很短。如果您稍微修改它以删除.waitFor(或添加一个高阶函数来消耗InputStreamReader到达时返回的部分读取),您可能会在进程返回时获得更新的数据。但是要小心死锁,以防您的子进程也需要输入(如您的lein repl示例中所示)。

于 2013-03-30T13:52:40.987 回答