あいつの日誌β

働きながら旅しています。

Python で子プロセスを Popen して returncode を追跡したい

Python で子プロセスにコマンドを実行させて、それが失敗した場合を検出したい。 exit 1 的なアレ。 調べた結果以下のようにすれば良い模様。

import time
import subprocess

cmd = ('cat', '/hogehogehoge')
p1 = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
time.sleep(0.001)
if p1.poll():
    print "it doesn't work..."
    print p1.stderr.readline()

time.sleep をするところが味噌。 実行結果は下記の通り

:!python %                                                            
it doesn't work...
cat: /hogehogehoge: そのようなファイルやディレクトリはありません

なお、このケースでは time.sleep はもっと短くても問題ないのですが起動に時間がかかるコマンドの場合は各自で調整しましょう。