Unix ではshell=True
、2 番目以降の引数がシェル自体に対するものであることを意味し、文字列を使用してコマンドをシェルに渡します。
import subprocess
cmd = 'echo $HOME'
proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
print proc.communicate()[0],
次のように書くこともできます。
import subprocess
cmd = 'echo $HOME'
print subprocess.check_output(cmd, shell=True),
サブプロセスのドキュメントから:
を使用するUnixshell=True
では、シェルはデフォルトで /bin/sh になります。args が文字列の場合、その文字列はシェルを介して実行するコマンドを指定します。つまり、シェル プロンプトで入力したときとまったく同じように文字列をフォーマットする必要があります。これには、たとえば、スペースを含むファイル名を引用またはバックスラッシュでエスケープすることが含まれます。args がシーケンスの場合、最初の項目はコマンド文字列を指定し、追加の項目はシェル自体への追加の引数として扱われます。つまり、Popen は以下と同等のことを行います。
Popen(['/bin/sh', '-c', args[0], args[1], ...])