2017-03-11 38 views
2

単純なUNIX bashコマンドシェルとして機能するPythonスクリプトを作成しようとしています。スクリプトからすべての出力をブロックし、2つのファイルのいずれかにリダイレクトする必要があります(エラーまたは出力)。残念なことに、ディレクトリ上でbashコマンドを実行すると、 "grep:test_dir:ディレクトリです"という出力が得られます。これは、sys.stdoutを一時ファイルにリダイレクトした後です。私の理論は、grep自体が単に出力を返すのではなく、出力をリセットしてこのエラーを出力するということです。すべての出力をファイルにリダイレクトする方法はありますか?それとも、私はちょうどpythonでリダイレクトする方法を誤解していますか?subprocess.call出力のリダイレクトは動作しません

ここは私の現在のコードです。パイソンdocから

try: 
    temp_out = sys.stdout 
    sys.stdout = open('./temp.txt', 'w+') 
    output = subprocess.call(['grep', search[0], search[1]]) 
    sys.stdout = temp_out 
except subprocess.CalledProcessError as err: 
    print output 
    err_output = err.returncode 
    print "In error" 

答えて

0

STDOUTは(プリントの出力のために使用される)および式ステートメントと入力のプロンプトの();

私の推測では、サブプロセスでは機能しません。これを行うには

一つの方法:

p = subprocess.Popen(['grep', search[0], search[1]], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
out, err = p.communicate() 
sys.stdout.write(out) # you have to decode byte to str if it's Python3 
sys.stderr.write(err) 
+0

これは私が必要としていたものです。それは私が操作できる異なる変数に戻り値と考えられるエラーの両方を分離します。 –

+0

@JacobChesley実際には、サブプロセスの出力とエラーだけをファイルにリダイレクトしたい場合は、9000の方が優れています。あなたのプログラムで 'print(...) 'を含むすべてのものをリダイレクトしたいのであれば、私のほうがいいです。 – Liteye

+0

この場合、印刷を含むサブプロセスのすべての出力をリダイレクトしたかったのです。これは、私が必要とするフォーマットにすべての出力を操作できるようになったためです。この場合、あなたのソリューションは私が探していたものでしたが、9000'sは将来の努力のためにフードの下に置くことをお勧めします。 –

0

sys.stdoutを交換しないでください。通常のファイルを開き、stdoutパラメータとして渡します。

with open('destination.txt', 'w') as redirected_output: 
    p = subprocess.Popen(['ls', '-l'], stdout=redirected_output) 
    p.communicate() 

ちょうど私のために働いた。

+0

残念ながら、サブプロセス自身がstdoutに送る出力をリダイレクトする必要がありました。これは私のプログラムがすでに行った戻り値だけをリダイレクトします。 lsコマンドはこのエラーの問題を抱えていません。少なくとも、その特定の呼び出しでは問題はありません。 –

関連する問題