methaneのブログ

このブログに乗せているサンプルコードはすべてNYSLです。

バッチがわりに Python を使うときは、 os.system よりも subprocess.call を使おう

次の2つのスクリプトは同じに見える。

#!/usr/bin/env python
import os
for i in xrange(100):
    cmd = "tail -f /var/log/syslog | cat "
    os.system(cmd)
#!/usr/bin/env python
import subprocess
for i in xrange(100):
    cmd = "tail -f /var/log/syslog | cat "
    subprocess.call(cmd, shell=True)

タイプ数が少ない分前者のほうが良さそうに見える。
でも、このスクリプトを止めようとしてCtrl-Cを押すと、前者はそのまま次のループが実行されてしまうのに対して、後者は例外を出して止まってくれる。

シグナルによる終了とは別に、終了コードが0で無かった場合にも例外を出してくれる subprocess.check_call も便利だ。