■ はじめに
https://dk521123.hatenablog.com/entry/2021/07/30/000000
で扱った pigz を Python から 起動するような処理を見た。 今回は、Python から コマンド実行することについて、まとめてみた。
目次
【0】外部コマンド実行モジュールについて 【1】os モジュール 1)API仕様:os.system() 2)サンプル 【2】subprocess モジュール 1)API仕様 2)サンプル 3)os.system() への置き換え 【3】補足:commands モジュール
【0】外部コマンド実行モジュールについて
Python上で、Linuxコマンドなどを実行する際に 対応しているモジュールは、以下の通り。
対応モジュール
【1】os モジュール 【2】subprocess モジュール << ★実装するなら、このモジュール★ 【3】(Python2.Xのみ)commands モジュール
【1】os モジュール
os.system() を使用する方法があるが、 「【2】subprocess モジュール」を使用することを推奨されている。
1)API仕様:os.system()
https://docs.python.org/ja/3/library/os.html#os.system
より抜粋 ~~~~~~ この関数の代わりに subprocess モジュールを利用することが 推奨されています ~~~~~~
2)サンプル
import os result_code = os.system('pigz sample.txt') print(f'result code = {result_code}')
実行コマンドと実行結果
$ python3 sample.py result code = 0 # pigzコマンドが実行され、sample.txtが圧縮される
補足:pigzコマンド
* 以下の関連記事を参照のこと。
https://dk521123.hatenablog.com/entry/2021/07/30/000000
【2】subprocess モジュール
現状、推奨されている方法。
1)API仕様
https://docs.python.org/ja/3/library/subprocess.html
より抜粋 ~~~~~~ サブプロセスを起動するために推奨される方法は、 すべての用法を扱える run() 関数を使用することです。 より高度な用法では下層の Popen インターフェースを 直接使用することもできます。 ~~~~~~
2)サンプル
import subprocess result = subprocess.run('pigz sample.txt', shell=True) print(f'result args = {result.args}, code = {result.returncode}')
実行コマンドと実行結果
$ python3 sample.py result args = pigz sample.txt, code = 0 # pigzコマンドが実行され、sample.txtが圧縮される
3)os.system() への置き換え
https://docs.python.org/ja/3/library/subprocess.html#replacing-os-system
より抜粋 ~~~~~~ sts = os.system("mycmd" + " myarg") # becomes sts = call("mycmd" + " myarg", shell=True) ~~~~~~ なので、subprocess.call() で書き換えればよさそう。 result = subprocess.call('<Command>', shell=True)
【3】補足:commands モジュール
システムへコマンド文字列を渡して実行するモジュールだが Python3 では、削除されている。
https://docs.python.org/ja/2.7/library/commands.html
より抜粋 ~~~~~~~ バージョン 2.6 で非推奨: commands モジュールは Python 3 で削除されました。 代わりに subprocess モジュールを使ってください。 ~~~~~~~
参考文献
https://tkmr.hatenablog.com/entry/2015/09/29/235154
関連記事
Python ~ 基本編 / 文字列 ~
https://dk521123.hatenablog.com/entry/2019/10/12/075251
Python ~ 基本編 / フォルダ・ファイル操作 ~
https://dk521123.hatenablog.com/entry/2019/09/02/000000