2017-08-26 22 views
1

我尝试:如何在没有任何外部库的情况下从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中完成这个简单的任务?

回答

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)))) 
+0

它与shell不完全相同(例如,shell允许“重写”当前行,例如进度条总是只显示一次),但它足够接近。谢谢 :)。 – monnef

+0

在我的示例中,我只使用println函数。对于重写行为,您必须实现自己的打印回车的println函数。请参阅:https://stackoverflow.com/questions/9566654/print-a-carriage-return-in-java-on-windows-on-console –

相关问题