如何在没有任何外部库的情况下从Clojure执行程序并实时显示其输出?

时间:2017-08-26 12:41:29

标签: clojure

我的尝试:

(import 'java.lang.Runtime)
(. (Runtime/getRuntime) exec (into-array ["youtube-dl" "--no-playlist" "some youtube video link"]))

我也试过sh。但是这两种方法都没有做我想做的事情 - 像shell一样运行程序(sh等待程序退出,exec启动它并且不等待退出;两者都不输出任何标准输出)。我想要实时显示过程输出,例如当我运行youtube-dl时,我希望看到视频下载的进展。

如何在Clojure中完成这个简单的简单任务?

1 个答案:

答案 0 :(得分:2)

您必须启动该进程并侦听其输出流。一个解决方案是:

(:require [clojure.java.shell :as sh]
          [clojure.java.io :as io])

(let [cmd ["yes" "1"]
      proc (.exec (Runtime/getRuntime) (into-array cmd))]
      (with-open [rdr (io/reader (.getInputStream proc))]
        (doseq [line (line-seq rdr)]
          (println line))))