Python subprocess.call関数のshell引数の謎

Pythonでサブプロセスに何か仕事をさせるとき、subprocess.call()関数を使って、

>>> import subprocess # 以下、この文は省略。
>>> ret = subprocess.call('cal', shell=True)

のように書きます。

このときのshell引数がなんじゃろな?という話です。

まず、第一引数のコマンドが引数を取らない場合は、shell=Falseすなわち、デフォルト値でかまいません。
デフォルト値をわざわざ記述する必要はありませんから、

>>> ret = subprocess.call('cal')

でOK。

次に、第一引数のコマンドがコマンドライン引数を取る場合について考えてみます。
このとき、shell引数を指定せずに

>>> ret = subprocess.call('cal 2003')

と書くと、これは”cal 2003″という空白文字を含んだ1つのコマンドを実行したことになります。
普通、そのようなコマンドは存在しませんから、当然エラーになります。

そこで、”cal 2003″という文字列を”cal”というコマンド名と”2003″という引数としてPythonに理解させたい場合に、shell=Trueを指定します。

こうすると、文字列全体がシェルに渡され、コマンドと引数に分割してくれます。

shell=Trueを指定しない方法

subprocess.call()関数に、コマンドと引数のリストを渡してやります。

>>> ret = subprocess.call(['call', '2003'])