プログラムをサイレントにする場合は、stderr
とstdout
をキャプチャする必要があります。 2つの選択肢はstderr=subprocess.STDOUT
で、stdoutパイプにstdoutとerrをインターリーブすることを意味します。またはstderr=subprocess.PIPE
を使用して、stderrを区別します。
しかし、2番目の問題があります。 stdout
を読んでいないので、プログラムがパイプを満たすのに十分なデータを出力すると、パイプがハングします。そこには潜在的な第三の問題があります - あなたがp.wait()
と呼ぶ必要がある行のどこかで、ゾンビプロセスにならないようにしてください。
あなたはファイルに送ることができます:
proc = subprocess.Popen('python myScript.py', shell=True,
stdout=open('stdout.txt', 'wb'), stderr=open('stderr.txt', 'wb'))
や背景のスレッドが作業を行う必要があり:
def out_err_thread(out_err_list, proc):
out, err = proc.communicate()
proc = subprocess.Popen('python myScript.py', shell=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out_err = []
_t = threading.Thread(target=out_err_thread, args=(out_err, proc))
_t.start()
またはビットバケット
proc = subprocess.Popen('python myScript.py', shell=True,
stdout=open(os.devnull, 'wb'), stderr=subprocess.STDOUT)
に送ってありますこのスクリプトの問題?あなたが求めていることをしているように見えます。 –
問題は、スクリプトには制御できない出力があることです。より良い例は、スニッファを実行するか、一定の出力ストリームで何かを実行するコマンドでした。どんな理由であれ、プログラムは必要のない情報を吐き出しています。私はそのコマンドを実行する方法を知り、スクリプトの残りの部分に戻り、ランダムなガベージを出力しないで出力を無視する必要があります。 –
'stdout'データが表示されないので、表示されるものは' stderr'です。一般的に、データには何が起こりますか?それを捨てなさい?それをファイルに書きますか?それを記憶に残す? – tdelaney