2017-08-26 5 views
1

私の試み:外部ライブラリなしでClojureからプログラムを実行し、リアルタイムでその出力を表示するには?

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

私もshを試してみました。しかし、どちらの方法もシェルのようにプログラムを実行すると(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

それはシェルが(たとえば、プログレスバーが常に一度だけ示されているためので、例えばシェルは、現在の行を「書き換える」ことを可能にする)それをしないとまったく同じではないのですが、それは十分に近いです:一つの解決策はあります。ありがとうございました :)。 – monnef

+0

私の例では、println関数を使用しています。リライトの動作では、キャリッジリターンを出力する独自のprintln関数を実装する必要があります。参照:https://stackoverflow.com/questions/9566654/print-a-carriage-return-in-java-on-windows-on-console –

関連する問題