2016-04-06 11 views
2

プロセスを開始してからstdoutから読み込み、OKがロードされているかどうかを確認するコードがあります。Linuxパイプの読み込みが終了しましたが、残りの部分を破棄したい

その後、私は理想的/dev/nullまたはそれを捨てる何かに出力をリダイレクトしたいと思います。私は(A)この状況でベストプラクティスとは何ですか、そして(B)パイプがいっぱいになると書き込みプロセスはどうなりますか?パイプがいっぱいになって読み取り/消去されていないときにブロックされますか?

目的が/dev/nullにリダイレクトされるのであれば、これをどのようにしてPythonとsubprocess.Popenで表示することができますか?

proc = subprocess.Popen(command, stderr=subprocess.PIPE) 
while True: 
    if init_string in proc.stderr.readline(): 
     break; 

proc.stderr.redirect ?? 
+0

あなたがスクリプトを実行し、その出力 'のpython firstprogram.py>は/ dev/null'なので –

+0

を捨てることができ、私はしかし最初に少し読んだ後破棄する必要があります。 – John

答えて

-2

あなたはすべての出力を破棄したい場合:

python your_script.py > /dev/null

しかし、あなたはあなたが使用できるのPythonからそれを実行したい場合は:あなたは、印刷

import sys 
sys.stdout = open('file', 'w') 
print 'this goes to file' 

毎回標準出力はファイル "file"にリダイレクトされ、/ dev/nullまたは任意のファイルに変更され、必要な結果が得られます。

+0

ありがとうございますが、私はすぐにではなく、しばらくの間それを読んだ後に標準エラー出力をリダイレクトする必要があります。私は、それから読み込みがしばらくしてバッファを埋めることなく、呼び出しプロセスをブロックしようとするときに呼び出しプロセスをブロックすることを心配しています。 – John

+0

何から読みましたか? stderrから読み取っていないので... –

+0

プロセスを開始するスクリプトは、プロセスの 'stderr'から読み込みます。いくつかのinitメッセージを読んで、起こったことを確認してから、プロセスを開いたり閉じたりします。この時点で、出力をリダイレクトして、 'stderr'に書き込むプロセスが決して読み込まれないバッファにプッシュしないようにしたいと思います。 – John

2

私の知る限りでは、それが実行を開始した後、子プロセスのファイル記述子を閉じて再度開く方法はありません。そして、OSには限られたバッファしかないので、パイプから何も消費しないと、最終的には子プロセスがブロックされます。つまり、書き込み終了時までパイプから読み続けるだけで済みます。

あなたはあなたのプログラムがその間に有益な何かをやって続けたい場合は、別のスレッド(未テスト)へのデータのかかる部分を移動することを検討しては:

def read_all_from_pipe(pipe): 
    for line in pipe: # assuming it's line-based 
    pass 

Thread(lambda: read_all_from_pipe(proc.stderr)).start() 

あなたの問題を解決するために他の方法があるかもしれません、しかし、。最初に特定の出力を待つ必要があるのはなぜですか?それは "OKロード"していない場合、子供がゼロでない終了コードで死んではいけませんか?代わりに、子供が任意の出力を表示しているのではなく、何をすべきかを確認できますか?

+0

ありがとう!私はそれが事実だろうと恐れていた。私はおそらくあなたが示唆するように、読者のスレッドをスピンアップします、それはちょうど無駄だったようです。 – John

+0

これを行うもう1つの方法は、ファイルにリダイレクトしてから、親アプリケーションにそのファイルを読み込ませることです。 – John

+0

分割してパイプを作る方法があり、パイプの一部が閉じていない場合は、 – John

関連する問題