「PythonでLinuxコマンドを実行したい」
このような場合には、subprocessがオススメです。
この記事では、PythonでLinuxコマンドを実行する方法を解説しています。
本記事の内容
- subprocessとは?
- subprocessのシステム要件
- subprocessのインストール
- subprocessの動作確認
それでは、上記に沿って解説していきます。
subprocessとは?
公式では、次のように説明されています。
subprocess モジュールは新しいプロセスの開始、入力/出力/エラーパイプの接続、リターンコードの取得を可能とします。
わかりにくい説明です。
簡単に言うと、subprocessを使うとPythonからOSコマンドを実行できます。
LinuxでもWindowsでも、特に違いはありません。
ただ、Linuxコマンドの利用が多くなるでしょう。
PHPで言うと、exec()関数と似たようなモノです。
以上、subprocessについて説明しました。
次は、subprocessのシステム要件を説明します。
subprocessのシステム要件
subprocessは、Pythonの標準モジュールです。
そして、subprocessが推奨される利用方法はrun()関数を用いる方法になります。
このrun()関数は、Python 3.5で追加されました。
そのため、Python 3.5以降が必要になります。
以下は、Python公式開発サイクルです。
バージョン | リリース日 | サポート期限 |
3.6 | 2016年12月23日 | 2021年12月23日 |
3.7 | 2018年6月27日 | 2023年6月27日 |
3.8 | 2019年10月14日 | 2024年10月 |
3.9 | 2020年10月5日 | 2025年10月 |
3.10 | 2021年10月4日 | 2026年10月 |
2022年時点では、Python 3.7以降がサポート対象になっています。
よって、subprocessのシステム要件はPython 3.7以降と言えます。
以上、subprocessのシステム要件を説明しました。
次は、subprocessのインストールを説明します。
subprocessのインストール
subprocessは、Pythonの標準モジュールです。
そのため、別途追加でインストールする必要はありません。
ただし、Python3.7以降の利用が推奨されます。
可能なら、最新となるPython 3.10を利用しましょう。
Python 3.10のインストールは、次の記事で説明しています。
最新バージョンを利用するなら、アップグレードもよいでしょう。
以上、subprocessのインストールについて説明しました。
次は、subprocessの動作確認を説明します。
subprocessの動作確認
subprocessの動作を以下のパターンで確認します。
- 戻り値なし
- 戻り値あり
それぞれを以下で説明します。
戻り値なし
Python上で実行しても、コマンドの実行結果が変数に格納されないパターンです。
import subprocess proc = subprocess.run(["ls", "-l", "/etc/ssh"])
上記コードを実行すると、コンソールに次のように表示されます。
合計 8 -rw-r--r-- 1 root root 1603 6月 7 2020 ssh_config drwxr-xr-x 2 root root 4096 6月 7 2020 ssh_config.d
これは、次のコマンドを実行したのと全く同じことですね。
$ ls -l /etc/ssh 合計 8 -rw-r--r-- 1 root root 1603 6月 7 2020 ssh_config drwxr-xr-x 2 root root 4096 6月 7 2020 ssh_config.d
なお、変数procを表示すると次のよう内容となっています。
CompletedProcess(args=['ls', '-l', '/etc/ssh'], returncode=0)
argsが、実行したコマンドの内容です。
returncodeは、コマンドの実行結果の終了コードとなります。
returncodeが0の場合は、正常終了を表わしています。
とりあえずは、0かそれ以外で判別すれば問題はないでしょう。
上記の結果では、procにもコマンドの実行した結果は入っていません。
このままでは、不便です。
戻り値あり
procにコマンドの実行結果を入れるためには、capture_outputをTrueに設定します。
import subprocess proc = subprocess.run(["ls", "-l", "/etc/ssh"], capture_output=True)
上記コードの場合は、procは以下の値となります。
CompletedProcess(args=['ls', '-l', '/etc/ssh'], returncode=0, stdout=b'\xe5\x90\x88\xe8\xa8\x88 8\n-rw-r--r-- 1 root root 1603 6\xe6\x9c\x88 7 2020 ssh_config\ndrwxr-xr-x 2 root root 4096 6\xe6\x9c\x88 7 2020 ssh_config.d\n', stderr=b'')
stdoutに標準出力(コマンドの実行結果)が入ります。
stderrには、標準エラー出力が入ることになります。
これでprocをプログラム内で利用しやすくなりました。
次にようにすれば、標準出力をPython上で扱えます。
print(proc.stdout)
上記の結果は、以下。
b'\xe5\x90\x88\xe8\xa8\x88 8\n-rw-r--r-- 1 root root 1603 6\xe6\x9c\x88 7 2020 ssh_config\ndrwxr-xr-x 2 root root 4096 6\xe6\x9c\x88 7 2020 ssh_config.d\n'
標準出力が表示されていますが、エンコードされたままです。
これをエンコードされないようにするのは、「text=True」を設定します。
import subprocess proc = subprocess.run(["ls", "-l", "/etc/ssh"], capture_output=True, text=True) print(proc.stdout)
上記を実行した結果は、以下。
合計 8 -rw-r--r-- 1 root root 1603 6月 7 2020 ssh_config drwxr-xr-x 2 root root 4096 6月 7 2020 ssh_config.d
これでコマンド実行の結果をPythonで扱いやすくなりました。
以上、subprocessの動作確認を説明しました。