2016-09-12 45 views
1

外部プロセスをPythonで実行し、そのstderrのみを処理します。subprocess.check_outputから標準出力のみを取得する

私はsubprocess.check_outputを使用できますが、標準出力を/dev/nullにリダイレクトする(または無視する)にはどうすればよいですか?stderrのみを受信しますか?

+0

重複が間違っていたので、 'check_output'は' stdout'を上書きすることができません! –

+0

Python 2.7にのみ必要な理由はありますか? –

+0

*エラー*または*成功*またはその両方の場合に出力をキャッチしたいですか? –

答えて

3

残念ながらあなたはこの、Pythonの3.5のように、これまでrun()を使用して簡単なことでしょうタグを付けています:単純にリダイレクトすることはできませんcheck_output()標準出力で

import subprocess 

output = subprocess.run(..., stdout=subprocess.DEVNULL, 
         stderr=subprocess.PIPE).stderr 

を:

>>> subprocess.check_output(('ls', 'asdfqwer'), stdout=open(os.devnull, 'wb'), stderr=subprocess.STDOUT) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/subprocess.py", line 566, in check_output 
    raise ValueError('stdout argument not allowed, it will be overridden.') 
ValueError: stdout argument not allowed, it will be overridden. 

使用Popenオブジェクトとcommunicate()、Pythonのバージョンが3.5未満です。オープン/dev/nullのpython 2.7でos.devnullを使用して:

>>> import subprocess 
>>> import os 
>>> with open(os.devnull, 'wb') as devnull: 
...  proc = subprocess.Popen(('ls', 'asdfqwer'), 
...        stdout=devnull, 
...        stderr=subprocess.PIPE) 
...  proc.communicate() 
...  proc.returncode 
... 
(None, "ls: cannot access 'asdfqwer': No such file or directory\n") 
2 

が通信パイプ場合は、標準入力に入力を送信し、ファイルの終わりに到達するまで、stdoutとstderrから読み込みます。

+0

ありがとうございました。私はそれを行う簡単な方法を見つけました。 – DevShark

0

私は、単純なトリックが見つかりました:これは、標準出力をフィルタリング、および標準エラー出力のみを保持します

import subprocess 
stderr_str = subprocess.check_output('command 2>&1 >/dev/null') 

を。

関連する問題