ユーニックス総合研究所

  • home
  • archives
  • python-subprocess

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関数の引数の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はバイト列になってますので文字列にしたい場合はデコードが必要です。