PythonのREPL上でシステムコマンドを実行する方法

PythonのPythonシェル(REPL)で、システムコマンド(bashなどのシェルコマンド)を実行するいくつかの方法を説明しています。

目的と動作環境

最終更新日:2021/7/4

PythonのPythonシェル(REPL)上で、bashなどのシステムコマンドが実行できると、pythonコードとシェルのコマンドを組み合わせて使えるようになり非常に便利です。

ここでは、Pythonシェル上でシステムコマンドを実行する方法を試しながら説明していきます。

■動作環境やバージョンは以下の通りです。
OS:macOS Big Sur(バージョン11.4)
Pythonバージョン:3.9.0

$ python -V
Python 3.9.0

os.systemを使う

最初は、osモジュールのsystemメソッドです。

>>> import os;
>>> os.system("ls -l")
total 8
drwxr-xr-x  19 username  staff  608  7  4 02:22 bin
drwxr-xr-x   2 username  staff   64  7  4 02:21 include
drwxr-xr-x   3 username  staff   96  7  4 02:21 lib
-rw-r--r--   1 username  staff   98  7  4 02:21 pyvenv.cfg
drwxr-xr-x   3 username  staff   96  7  4 02:22 share
0
osモジュールは、OS機能(ファイルやディレクトリの扱いなど)を利用する方法を提供するモジュールで、systemメソッド以外にも便利なメソッドが多くあります。

subprocess.call、subprocess.runを使う

次に、subprocessモジュールのcallメソッドとrunメソッドです。
まずはcallメソッドを試してみます。

>>> import subprocess;
>>> subprocess.call("ls")
bin		include		lib		pyvenv.cfg	share
0
callメソッドは、実行するシェルコマンドがオプション付きの場合、コマンドとオプションをlist型の変数の要素に分けて、callメソッドに渡す必要があります。
>>> subprocess.call(["ls","-l"])
total 8
drwxr-xr-x  19 username  staff  608  7  4 02:22 bin
drwxr-xr-x   2 username  staff   64  7  4 02:21 include
drwxr-xr-x   3 username  staff   96  7  4 02:21 lib
-rw-r--r--   1 username  staff   98  7  4 02:21 pyvenv.cfg
drwxr-xr-x   3 username  staff   96  7  4 02:22 share
0

runメソッドも同様に実行できます。

>>> subprocess.run("ls")
bin		include		lib		pyvenv.cfg	share
CompletedProcess(args='ls', returncode=0)

>>> subprocess.run(["ls","-l"])
total 8
drwxr-xr-x  19 username  staff  608  7  4 02:22 bin
drwxr-xr-x   2 username  staff   64  7  4 02:21 include
drwxr-xr-x   3 username  staff   96  7  4 02:21 lib
-rw-r--r--   1 username  staff   98  7  4 02:21 pyvenv.cfg
drwxr-xr-x   3 username  staff   96  7  4 02:22 share
CompletedProcess(args=['ls', '-l'], returncode=0)

[広告] Kindle Unlimitedなら対象の本が定額で読み放題
対象本には、プログラミングなどのIT関連本、マンガ、雑誌、ビジネス書などがたくさんあります!

commands.getoutputを使う(使えるのはPythonバージョン2、Python3で削除)

次に、commandsモジュールのgetoutputメソッドです。

commandsモジュールが使えるのはPythonのバージョン2で(バージョン2.6で非推奨)、バージョン3で削除されて使用できません。

>>> import commands;
>>> commands.getoutput('ls -l')
'total 8\ndrwxr-xr-x  19 username  staff  608  7  4 02:22 bin\ndrwxr-xr-x   2 username  staff   64  7  4 02:21 include\ndrwxr-xr-x   3 username  staff   96  7  4 02:21 lib\n-rw-r--r--   1 username  staff   98  7  4 02:21 pyvenv.cfg\ndrwxr-xr-x   3 username  staff   96  7  4 02:22 share'
改行コードがそのままで見にくいので、print()に渡します。
>>> print(commands.getoutput('ls -l'))
total 8
drwxr-xr-x  19 username  staff  608  7  4 02:22 bin
drwxr-xr-x   2 username  staff   64  7  4 02:21 include
drwxr-xr-x   3 username  staff   96  7  4 02:21 lib
-rw-r--r--   1 username  staff   98  7  4 02:21 pyvenv.cfg
drwxr-xr-x   3 username  staff   96  7  4 02:22 share

IPythonを使う

あと、Pythonの標準のREPLではなく、IPythonのREPLを使えばモジュールをインポートする必要なく、シェルのコマンドを実行できます。

$ ipython
Python 3.9.0 (default, Jan  9 2021, 22:05:52) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.25.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: ls -l
total 8
drwxr-xr-x  19 username  staff  608  7  4 02:22 bin/
drwxr-xr-x   2 username  staff   64  7  4 02:21 include/
drwxr-xr-x   3 username  staff   96  7  4 02:21 lib/
-rw-r--r--   1 username  staff   98  7  4 02:21 pyvenv.cfg
drwxr-xr-x   3 username  staff   96  7  4 02:22 share/
REPL上でシェルのコマンドを実行する場合、通常はコマンドの頭に"!"を付ける。
In [2]: !ls -l
total 8
drwxr-xr-x  19 username  staff  608  7  4 02:22 bin
drwxr-xr-x   2 username  staff   64  7  4 02:21 include
drwxr-xr-x   3 username  staff   96  7  4 02:21 lib
-rw-r--r--   1 username  staff   98  7  4 02:21 pyvenv.cfg
drwxr-xr-x   3 username  staff   96  7  4 02:22 share

IPythonは標準のPythonには入っていないので、pipなどでインストールする必要があります。
また、IPythonは標準のpythonシェル(REPL)をさらに強化したREPLがあり、シェルのコマンドが使える以外にも様々なメリットや機能(強力なコード補完機能やマジック関数など)があります。

IPythonのインストールや使い方については別ページで説明していますので、興味のある方はそちらを参考にしてください。
IPythonをインストールして使ってみる