出力の取得
stdoutとstderrを読み取ります
「出力の取得」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。
標準出力のキャプチャ
コマンドが出力した内容を読み取るには、capture_output=Trueを渡します。テキストは結果のstdout属性に入ります。
import subprocess
cp = subprocess.run(['echo', 'hello'], capture_output=True)
print(cp.stdout)バイト列とテキスト
デフォルトでは、出力はバイト列です。代わりにデコード済みの文字列を取得するにはtext=Trueを渡します。通常はこちらが必要になります。
import subprocess
cp = subprocess.run(['echo', 'hello'], capture_output=True, text=True)
print(repr(cp.stdout))末尾の改行の除去
コマンドの出力は、末尾に改行が付いていることがよくあります。値を使用する前に.strip()で取り除いてください。
import subprocess
cp = subprocess.run(['echo', 'value'], capture_output=True, text=True)
clean = cp.stdout.strip()
print('[' + clean + ']')標準エラー出力のキャプチャ
エラーは通常stderrに出力され、個別にキャプチャされます。これにより、通常の出力とエラーメッセージを区別できます。
import subprocess
cp = subprocess.run(['ls', '/no/such/dir'], capture_output=True, text=True)
print('stdout:', repr(cp.stdout))
print('stderr:', cp.stderr.strip())コードでの出力の利用
キャプチャした出力は単なる文字列なので、解析できます。行に分割したり、数値に変換したり、プログラムの残りの処理に渡したりできます。
import subprocess
cp = subprocess.run(['printf', 'a\nb\nc\n'], capture_output=True, text=True)
lines = cp.stdout.splitlines()
print('line count:', len(lines))
print(lines)stderrをstdoutにリダイレクトする
エラー出力を通常のストリームに統合するには、stderr=subprocess.STDOUTを設定します。すると両方の出力がstdoutに入ります。
import subprocess
cp = subprocess.run(['ls', '/no/such/dir'], stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, text=True)
print(cp.stdout.strip())入力の提供
input引数を使うと、コマンドの標準入力にデータを渡せます。ここではテキストをcatにパイプします。
import subprocess
cp = subprocess.run(['cat'], input='piped in\n', capture_output=True, text=True)
print(cp.stdout.strip())check_outputのショートカット
subprocess.check_output()はコマンドを実行し、標準出力を直接返します。失敗時には例外を発生させます。出力をキャプチャする便利な1行処理です。
import subprocess
out = subprocess.check_output(['echo', 'quick'], text=True)
print(out.strip())出力の破棄
コマンドの出力を抑制するには、ストリームをsubprocess.DEVNULLにリダイレクトします。
import subprocess
cp = subprocess.run(['echo', 'silent'], stdout=subprocess.DEVNULL)
print('return code only:', cp.returncode)出力を伴うエラー処理
check=Trueを使用している場合、発生したCalledProcessErrorには、診断に必要なキャプチャ済みのoutputとstderrも含まれます。
import subprocess
try:
subprocess.run(['ls', '/missing'], capture_output=True, text=True, check=True)
except subprocess.CalledProcessError as e:
print('failed:', e.returncode)
print('stderr:', e.stderr.strip())まとめて実装する
一般的なヘルパーは、コマンドを実行して成功を確認し、整形済みのテキストを返します。これはよく使われるパターンをまとめたものです。
import subprocess
def capture(cmd):
cp = subprocess.run(cmd, capture_output=True, text=True, check=True)
return cp.stdout.strip()
print(capture(['echo', 'final result']))確認問題
出力キャプチャの理解度を確認しましょう。
復習
出力をキャプチャする方法を学びました。
capture_output=Trueとtext=Trueを指定すると、文字列のstdoutとstderrを取得できます。stderr=subprocess.STDOUTでストリームを統合し、DEVNULLで出力を抑制します。input=で入力を渡せます。check_outputはそのショートカットです。- エラーにはデバッグ用のキャプチャ済み出力が含まれます。
次は、環境変数とosモジュールについて学びます。
よくある質問
「出力の取得」レッスンは無料ですか?
はい。「出力の取得」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。
「出力の取得」で何を学びますか?
stdoutとstderrを読み取ります ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Python Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「出力の取得」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPython Academyレッスンでコードを書いて実行できますか?
はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。