Pythonでサブプロセスを起動して出力を得る【run関数】

671, 2023-05-31

目次

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関数の引数のcheckTrueにするとサブプロセスが異常終了した場合に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はバイト列になってますので文字列にしたい場合はデコードが必要です。



この記事のアンケートを送信する