読者です 読者をやめる 読者になる 読者になる

timeoutを設定して子プロセスを実行する

Python

Python2.4からの標準ライブラリであるsubprocessではtimeoutを設定することができず、だいぶ探したんだけれども、Benjamin Smedbergのkillableprocessがよいと思う。

import subprocessをimport killableprocessに書き換えればそのまま使える。単純に外部コマンドを呼ぶ場合は、

from killableprocess import call
call(['/bin/date'], timeout=10)

timeout引数にタイムアウト秒数を指定。-1の場合はsubprocessと同じようにタイムアウトしない。
タイムアウトを設定してffmpegを呼ぶ例。

from subprocess import PIPE
from killableprocess import Popen

p = Popen(['/usr/local/bin/ffmpeg',
               '-y',
               '-i', 'input_file.flv',
               '-flags', 'bitexact',
               '-acodec', 'libfaac',
               '-vcodec', 'mpeg4',
               '-f', 'mp4',
               'output_file.mp4',
               ],
               stdin=PIPE, stdout=PIPE, stderr=PIPE
               )
p.wait(timeout=60 * 10)

変換処理を10分でタイムアウトするようにしてみた。ffmpegはstdinをNoneに設定すると処理が止まってしまうといことに気づかず、だいぶはまった。

試していないけれども、ctypesがインストールされていれば、Windowsでも使えるみたい。