2014-04-25 11 views

Odpowiedz

1

Można zainstalować subprocess32 modulementioned by @gps - nośnik modułu subprocess z Python 3.2/3.3 do użytku w wersji 2.x. Działa na Pythonie 2.7 i zawiera obsługę Timeout z Python 3.3.

subprocess.call() is just Popen().wait() a zatem przerwać długi proces uruchomiony w timeout sekund:

#!/usr/bin/env python 
import time 
from subprocess import Popen 

p = Popen(*call_args) 
time.sleep(timeout) 
try: 
    p.kill() 
except OSError: 
    pass # ignore 
p.wait() 

Jeśli proces dziecko może prędzej następnie przenośnym rozwiązaniem jest use Timer() as suggested in @sussudio's answer:

#!/usr/bin/env python 
from subprocess import Popen 
from threading import Timer 

def kill(p): 
    try: 
     p.kill() 
    except OSError: 
     pass # ignore 

p = Popen(*call_args) 
t = Timer(timeout, kill, [p]) 
t.start() 
p.wait() 
t.cancel() 

Na Unix, ty może use SIGALRM as suggested in @Alex Martelli's answer:

#!/usr/bin/env python 
import signal 
from subprocess import Popen 

class Alarm(Exception): 
    pass 

def alarm_handler(signum, frame): 
    raise Alarm 

signal.signal(signal.SIGALRM, alarm_handler) 


p = Popen(*call_args) 
signal.alarm(timeout) # raise Alarm in 5 minutes 
try: 
    p.wait() 
    signal.alarm(0) # reset the alarm 
except Alarm: 
    p.kill() 
    p.wait() 

Aby uniknąć używania tutaj wątków i sygnałów, moduł subprocess w Pythonie 3 używa busy loop with waitpid(WNOHANG) calls on Unix i winapi.WaitForSingleObject() on Windows.

4

Prosty sposób, w jaki zawsze wykonywałem limity czasu z 2,7, opóźnia się przy użyciu subprocess.poll() i time.sleep(). Oto bardzo prosty przykład:

import subprocess 
import time 

x = #some amount of seconds 
delay = 1.0 
timeout = int(x/delay) 

args = #a string or array of arguments 
task = subprocess.Popen(args) 

#while the process is still executing and we haven't timed-out yet 
while task.poll() is None and timeout > 0: 
    #do other things too if necessary e.g. print, check resources, etc. 
    time.sleep(delay) 
    timeout -= delay 

Jeśli ustawisz x = 600, wówczas czas oczekiwania wyniesie 10 minut. Podczas gdy task.poll() zapyta, czy proces został przerwany. time.sleep(delay) będzie spał przez 1 sekundę w tym przypadku, a następnie zmniejszy czas oczekiwania o 1 sekundę. Możesz bawić się tą częścią do treści swojego serca, ale podstawowa koncepcja jest taka sama w całym tekście.

Mam nadzieję, że to pomoże!

subprocess.poll()https://docs.python.org/2/library/subprocess.html#popen-objects

+0

To nie robi zabić proces. Musisz dodać os.killpg (os.getpgid (zadanie.pid), signal.SIGTERM) – AaronS

Powiązane problemy