====== Python モジュール: subprocess ====== ===== 概要 ===== * 複数のプロセスを制御するモジュール * 以下の場合に使う * 関数を別プロセスで並列で処理したい * 外部プログラムを呼び出したい ===== 使い方 ===== ==== モジュールの定義 ==== import subprocess ==== プロセス実行メソッド ==== * プロセス実行メソッドは大きく分けて ''run()'' と ''Popen()'' がある。\\ subprocess.run(COMMAND, OPTIONS) subprocess.Popen(COMMAND, OPTIONS) * ''Popen()'' は ''run()'' より細かな制御ができる。 * ''run()'' には、旧メソッドの ''call()''、''check_all()''、''check_output()'' が統合されている。 * ''run()'' と ''Popen()'' の共通オプション * ''shell=True|False'' (デフォルトは False): * True の場合、実行コマンド ''COMMAND'' を linux のコマンドのように文字列で与える。 * 引数の区切りをスペースとしているため、スペースを含む引数を与えると、誤認識する。 * False の場合、実行コマンド ''COMMAND'' をリストで与える。 * ワイルドカードでの指定ができなくなる。 * ''stdin=open(FILE_NAME, "rb")'': コマンドの標準入力に ''FILE_NAME'' から読み出したデータを与える。 * ''stdout=open(FILE_NAME, "wb")'': コマンドの標準出力を ''FILE_NAME'' に書き出す。 * ''stderr=open(FILE_NAME, "wb")'': コマンドの標準エラーを ''FILE_NAME'' に書き出す。 * ''stdin''、''stdout''、''stderr'' について * ファイルの扱いは byte 型の方が問題が起こりにくい。 * ''open()'' の代わりに、''subprocess.PIPE'' を指定すると、画面に出力する。 * ''open()'' の代わりに、''subprocess.DEVNULL'' を指定すると、出力を破棄する。 * ''timeout=X'': タイムアウトの秒数 ''X'' を指定する (ネットワークを利用するコマンド)。 * ''text=True|False'': PIPE で取得したデータをテキスト型として出力する (デフォルトは False でバイト型)。 * 例 * ''run()'' を単純に実行する場合:\\ import subprocess obj_proc=subprocess.run(["ls", "-l"]) * ファイルに結果を出力する場合:\\ import subprocess obj_proc=subprocess.run(["ls", "-l"], stdout=open("test.log", "w")) * ''Popen()'' を使う場合:\\ import subprocess obj_proc = subprocess.Popen(["ls", "-l"], stdout=open("test.log", "w")) * ''Popen()'' で画面に出力を表示する場合:\\ import subprocess obj_proc = subprocess.Popen(["ls", "-l"], stdout=subprocess.PIPE, text=True) obj_proc.communicate() ==== run() と旧メソッドの違い ==== ^ ^ 終了ステータス ^ 出力結果 ^ エラー例外 ^ ^''run()'' での引数や属性 ^ .returncode ^ .stdout ^ check ^ | ''call()'' | ○ | | | | ''check_call()'' | ○ | | | | ''check_output()'' | | ○ | ○ | * 旧メソッドは現在でも使えるが、''run()'' のオプションを切り替えることで同じ挙動になる。 ==== Popen.communicate() ==== * 標準出力、標準エラーをタプルにして返す。 * 標準出力、標準エラーの出力量が多い場合、''run()'' では処理できなくなるので、このメソッドを使うことになる。 * リアルタイムの出力管理や対話処理は扱えない。 ===== 参考サイト ===== * [[https://qiita.com/HidKamiya/items/e192a55371a2961ca8a4 | subprocessについてより深く(3系,更新版) - Qiita]] * [[https://dev.classmethod.jp/articles/python-subprocess-shell-command/ | Pythonからシェルコマンドを実行!subprocessでサブプロセスを実行する方法まとめ | DevelopersIO]] {{tag>プログラミング}}