PythonのPythonシェル(REPL)で、システムコマンド(bashなどのシェルコマンド)を実行するいくつかの方法を説明しています。
※ 本ページはプロモーションが含まれています。
PythonのPythonシェル(REPL)上で、bashなどのシステムコマンドが実行できると、pythonコードとシェルのコマンドを組み合わせて使えるようになり非常に便利です。
ここでは、Pythonシェル上でシステムコマンドを実行する方法を試しながら説明していきます。
■動作環境やバージョンは以下の通りです。
OS:macOS Big Sur(バージョン11.4)
Pythonバージョン:3.9.0
$ python -V
Python 3.9.0
最初は、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メソッドと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)
次に、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
あと、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をインストールして使ってみる