Pythonでサブプロセスを起動して出力を得る【run関数】
- 作成日: 2023-05-31
- 更新日: 2023-12-24
- カテゴリ: Python
Pythonでサブプロセスを扱う
Pythonでサブプロセスを起動するにはsubprocess
モジュールが使えます。
このモジュールを使って外部コマンドを起動して出力を得る方法を解説します。
参考:subprocess --- サブプロセス管理 — Python 3.11.3 ドキュメント
関連記事
Djangoでオブジェクトを一括作成・更新【bulk_create, bulk_update】
DjangoのModel.objects.filter()の使い方【QuerySet】
Djangoのmodelのcreate()の使い方【Python】
Django入門: ルートの設定 ~ 簡単な一行掲示板アプリを作る その4【Windows10】
NumPyのappend()の使い方: 配列の末尾に要素を追加
Numpyのarangeの使い方: 指定範囲の数列を生成する
Python3でYoutube Data APIを使ってキーワード検索する
PythonからC言語(my.puts)を呼び出して実行する
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
はバイト列になってますので文字列にしたい場合はデコードが必要です。