【Python】Python ~ 基本編 / 外部コマンド実行 ~

■ はじめに

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