web-dev-qa-db-ja.com

pythonサブプロセス呼び出しでの出力の抑制

次のコマンドの場合:

subprocess.call(shlex.split(
            """/usr/local/itms/bin/iTMSTransporter -m lookupMetadata 
              -Apple_id %s -destination %s"""%(self.Apple_id, self.destination))

出力全体をターミナルウィンドウに出力します。ここですべての出力を抑制するにはどうすればよいですか?やってみましたsubprocess.call(shlex.split(<command> > /dev/null 2&1))、しかしそれは必要な結果を生み出しませんでした。ここでどうすればいいですか?

36
David542

_stdout=_および_stderr=_パラメータをsubprocess.call()に使用して、stdoutまたはstderrを選択したファイル記述子に指定できます。だからおそらくこのようなもの:

_import os

devnull = open(os.devnull, 'w')
subprocess.call(shlex.split(
    '/usr/local/itms/bin/iTMSTransporter -m lookupMetadata '
    '-Apple_id %s -destination %s' % (self,Apple_id, self.destination)),
  stdout=devnull, stderr=devnull)
_

パイプから読み取っていない場合に_subprocess.PIPE_を使用すると、大量の出力が生成される場合にプログラムがブロックされる可能性があります。

更新

@yanlendがコメントで言及しているように、新しい(3.x)バージョンのPythonは_subprocess.DEVNULL_を含めて、より便利で移植可能な方法でこの問題を解決します。その場合、コード次のようになります:

_subprocess.call(shlex.split(
    '/usr/local/itms/bin/iTMSTransporter -m lookupMetadata '
    '-Apple_id %s -destination %s' % (self,Apple_id, self.destination)),
  stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
_
50
larsks

私にとってうまくいったのは、コマンドの最後に2>/dev/nullを追加することです。

5
David542