Pythonでサブプロセスを起動して出力を得る【run関数】
目次
Pythonでサブプロセスを扱う
Pythonでサブプロセスを起動するにはsubprocess
モジュールが使えます。
このモジュールを使って外部コマンドを起動して出力を得る方法を解説します。
参考:subprocess --- サブプロセス管理 — Python 3.11.3 ドキュメント
subprocessの基本的な使い方
subprocess
を使うにはまずimport
する必要があります。
import subprocess
そして外部コマンドを起動するにはrun
関数を使います。
# Linuxの場合 subprocess.run(['ls', '.']) # Windowsの場合 subprocess.run(['cmd', '/C', 'dir'])
上記のコードをそれぞれのOSの環境で実行するとディレクトリ(フォルダ)の中身が表示されます。
Windowsの場合はcmd /C dir
というコマンドラインにしていますが、オプション/C
は引数のコマンドをコマンドプロンプトで実行するオプションです。
run関数の返り値
run
関数は返り値としてCompletedProcess
オブジェクトを返します。
終了ステータスを得たい場合は返り値のreturncode
を参照します。
result = subprocess.run(['cmd', '/C', 'dir']) print(result.returncode) # 0
run関数のinput引数
run
関数の引数のinput
はサブプロセスの標準入力に渡されます。
サブプロセスに標準入力から入力を与えたい場合はこのinput
に入力を指定します。
入力はバイト列である必要があります。
# sample.py import sys print(sys.stdin.read())
# main.py import subprocess subprocess.run(['python', 'sample.py'], input=b'test')
実行結果。
test
run関数のcheck引数
run
関数の引数のcheck
をTrue
にするとサブプロセスが異常終了した場合にCalledProcessError
例外を送出するようになります。
# sample.py import sys sys.exit(1)
# main.py import subprocess subprocess.run(['python', 'sample.py'], check=True)
実行結果。
Traceback (most recent call last): File "main.py", line 4, in <module> subprocess.run(['python', 'sample.py'], check=True) File "C:\user\.pyenv\pyenv-win\versions\3.8.10\lib\subprocess.py", line 516, in run raise CalledProcessError(retcode, process.args, subprocess.CalledProcessError: Command '['python', 'sample.py']' returned non-zero exit status 1.
capture_output引数で出力を受け取る
run
関数のcapture_output
フラグをTrue
にすると出力をキャプチャします。
標準出力と標準エラー出力をキャプチャします。
# Windowsの場合 result = subprocess.run(['cmd', '/C', 'dir'], capture_output=True) print(result.stdout.decode('cp932')) print(result.stderr.decode('cp932'))
上記のコードを実行するとdir
コマンドの出力結果がprint()
で出力されます。
Windows環境の場合は出力がcp932
になっていますのでバイト列をそのようにデコードします。
result.stdout
はバイト列になってますので文字列にしたい場合はデコードが必要です。