You can try to put an alarm around the process
from signal import alarm, signal, SIGALRM, SIGKILL
TIMEOUT=-9
def run_proc_timeout(proc, timeout):
class _Alarm(Exception):
pass
def alarm_handler(signum, frame):
raise _Alarm
# setup alarm for timeout length
signal(SIGALRM, alarm_handler)
alarm(timeout)
try:
stdout, stderr = proc.communicate()
alarm(0)
except _Alarm:
pids = [proc.pid]
# kill proc and all its children
return TIMEOUT, "", ""
return proc.returncode, stdout, stderr