【Python】subprocessによるLinuxコマンドの実行

【Python】subprocessによるLinuxコマンドの実行 プログラミング

「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.62016年12月23日2021年12月23日
3.72018年6月27日2023年6月27日
3.82019年10月14日2024年10月
3.92020年10月5日2025年10月
3.102021年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の動作確認を説明しました。

タイトルとURLをコピーしました