2016-10-28 4 views
0

どのようにして、サブプロセスを開始するか、または連続した出力ストリームを持つpythonファイルを実行し、同時に残りのスクリプトを実行しますか?ここ サブプロセスからの出力を非表示にしてスクリプトの実行を続行するにはどうすればよいですか?

は、いくつかのサンプルコードです:

import subprocess 

p = subprocess.Popen('python myScript.py', shell=True, stdout=subprocess.PIPE) 

#this program will have a stream of output and is designed to run for 
#long periods of time 

print 'the program is still running!' 

doMoreStuff() 
+0

に送ってありますこのスクリプトの問題?あなたが求めていることをしているように見えます。 –

+0

問題は、スクリプトには制御できない出力があることです。より良い例は、スニッファを実行するか、一定の出力ストリームで何かを実行するコマンドでした。どんな理由であれ、プログラムは必要のない情報を吐き出しています。私はそのコマンドを実行する方法を知り、スクリプトの残りの部分に戻り、ランダムなガベージを出力しないで出力を無視する必要があります。 –

+0

'stdout'データが表示されないので、表示されるものは' stderr'です。一般的に、データには何が起こりますか?それを捨てなさい?それをファイルに書きますか?それを記憶に残す? – tdelaney

答えて

0

あなたのサンプルコードでsubprocess.Popen()を呼び出した後、メインプロセスはすぐにプリント()文に来るだろうし、その後ランニング、doMoreStuffを()を実行します残りのスクリプトを同時に実行する。

+0

私のサンプルコードは一例ですが、私がしようとしているのは、プログラムを中断させるような方法でデータを出力しているプログラムを実行することです。 –

+0

myScript.pyの出力を無視したいですか? 'subprocess.Popen( 'python myScript.py'、shell = True、stdout = subprocess.PIPE)'を 'subprocess.Popen( 'python myScript.py>/dev/null 2>&1'、shell = True、 stdout = subprocess.PIPE) '** Linux **または' subprocess.Popen( 'python myScript.py> NUL'、shell = True) '** Windows ** – David

+0

これはうまくいきました。 –

0

プログラムをサイレントにする場合は、stderrstdoutをキャプチャする必要があります。 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) 
関連する問題