[解決済み] subprocess.run()の出力を抑制またはキャプチャするには?
2022-07-18 18:29:12
質問
のドキュメントにある例から
subprocess.run()
からは何も出力されないように思えます。
subprocess.run(["ls", "-l"]) # doesn't capture output
しかし、私はpythonシェルでそれを試してみると、リストが出力されます。これはデフォルトの動作なのでしょうか、どうすれば
run()
.
どのように解決するのですか?
以下は を抑制する の出力を抑制する方法を、クリーン度の低い順に示します。Python 3 を使っていると仮定しています。
-
にリダイレクトすることができ、特別な
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)
-
完全に手作業で行う場合は
/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
のデータを取得します。
-
単に 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)
-
を使用することができます。
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)
関連
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] 最近のPythonでカスタム例外を宣言する適切な方法?
-
[解決済み] print関数の出力をフラッシュする(pythonの出力をバッファリング解除する)にはどうすればよいですか?
-
[解決済み] pytestの実行中に作成された通常の印刷出力を見るにはどうすればよいですか?
-
[解決済み】Python2のdict.items()とdict.iteritems()の違いは何ですか?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
-
[解決済み] Pandasのデータフレームでタプルの列を分割するにはどうしたらいいですか?
-
[解決済み] Pythonの構文に新しいステートメントを追加することはできますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] サブプロセスによるリアルタイム出力の取得
-
[解決済み] 2つの線分が交差しているかどうかを確認するにはどうすればよいですか?
-
[解決済み] PILからopenCVフォーマットへの変換
-
[解決済み] なぜ(0-6)は-6=偽なのか?重複
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
-
[解決済み] djangoフレームワークでフォームフィールドから値を取得するには?
-
[解決済み] Flaskで非同期タスクを作る
-
[解決済み] PySparkでデータフレームのカラムをString型からDouble型に変更する方法は?
-
[解決済み] PythonでSelenium WebDriverを使用してテキストを取得する方法