1. ホーム
  2. python

[解決済み] subprocess.run()の出力を抑制またはキャプチャするには?

2022-07-18 18:29:12

質問

のドキュメントにある例から subprocess.run() からは何も出力されないように思えます。

subprocess.run(["ls", "-l"])  # doesn't capture output

しかし、私はpythonシェルでそれを試してみると、リストが出力されます。これはデフォルトの動作なのでしょうか、どうすれば run() .

どのように解決するのですか?

以下は を抑制する の出力を抑制する方法を、クリーン度の低い順に示します。Python 3 を使っていると仮定しています。

  1. にリダイレクトすることができ、特別な subprocess.DEVNULL ターゲットになります。
import subprocess

subprocess.run(['ls', '-l'], stdout=subprocess.DEVNULL)
# The above only redirects stdout...
# this will also redirect stderr to /dev/null as well
subprocess.run(['ls', '-l'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
# Alternatively, you can merge stderr and stdout streams and redirect
# the one stream to /dev/null
subprocess.run(['ls', '-l'], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)

  1. 完全に手作業で行う場合は /dev/null にリダイレクトすることができます。他のすべては方法 #1 と同じになります。
import os
import subprocess

with open(os.devnull, 'w') as devnull:
    subprocess.run(['ls', '-l'], stdout=devnull)


以下はその方法です。 をキャプチャします。 の出力を (後で使用したり解析したりするために) 取得する方法を、クリーン度の低い順に示します。Python 3 を使っていると仮定しています。 以下の例では text=True (Python >= 3.7のみ。 universal_newlines=True を使用すると、出力を str の代わりに bytes - を省略する text=True / universal_newlines=True を取得する bytes のデータを取得します。

  1. 単に STDOUT と STDERR の両方を独立してキャプチャしたい場合、そして Python >= 3.7 を使用している場合は capture_output=True .
import subprocess

result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)
print(result.stderr)

  1. を使用することができます。 subprocess.PIPE を使うと、STDOUT と STDERR を別々に捕捉することができます。これは 任意の をサポートするPythonのバージョンで動作します。 subprocess.run .
import subprocess

result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE, universal_newlines=True)
print(result.stdout)

# To also capture stderr...
result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
print(result.stdout)
print(result.stderr)

# To mix stdout and stderr into a single string
result = subprocess.run(['ls', '-l'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
print(result.stdout)