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