Я бы посоветовал взглянуть на Класс таймера в модуле потоков. Я использовал его для реализации тайм-аута для Popen.
Сначала создайте обратный вызов:
def timeout( p ):
if p.poll() is None:
print 'Error: process taking too long to complete--terminating'
p.kill()
Затем откройте процесс:
proc = Popen( ... )
Затем создайте таймер, который будет вызывать обратный вызов, передавая ему процесс.
t = threading.Timer( 10.0, timeout, [proc] )
t.start()
t.join()
Где-то позже в программе вы можете добавить строку:
t.cancel()
В противном случае программа python будет продолжать работать до тех пор, пока не завершится работа таймера.
РЕДАКТИРОВАТЬ: Мне сообщили, что существует условие гонки, что подпроцесс p может завершиться между вызовами p.poll () и p.kill (). Я считаю, что следующий код может это исправить:
import errno
def timeout( p ):
if p.poll() is None:
try:
p.kill()
print 'Error: process taking too long to complete--terminating'
except OSError as e:
if e.errno != errno.ESRCH:
raise
Хотя вы можете захотеть очистить обработку исключений, чтобы конкретно обрабатывать только определенное исключение, которое происходит, когда подпроцесс уже нормально завершился.