¿Cómo limitar el tiempo de ejecución del progtwig cuando se usa subproceso?

Quiero usar el subproceso para ejecutar un progtwig y necesito limitar el tiempo de ejecución. Por ejemplo, quiero matarlo si se ejecuta durante más de 2 segundos.

Para progtwigs comunes, kill () funciona bien. Pero si bash ejecutar /usr/bin/time something , kill () no puede matar el progtwig.

Mi código de abajo parece que no funciona bien. El progtwig todavía se está ejecutando.

 import subprocess import time exec_proc = subprocess.Popen("/usr/bin/time -f \"%e\\n%M\" ./son > /dev/null", stdout = subprocess.PIPE, stderr = subprocess.STDOUT, shell = True) max_time = 1 cur_time = 0.0 return_code = 0 while cur_time  max_time: exec_proc.kill() 

hazlo así en tu línea de comando:

 perl -e 'alarm shift @ARGV; exec @ARGV'   

esto ejecutará el comando y lo terminará en segundo.

Un ejemplo ficticio:

 # set time out to 5, so that the command will be killed after 5 second command = ['perl', '-e', "'alarm shift @ARGV; exec @ARGV'", "5"] command += ["ping", "www.google.com"] exec_proc = subprocess.Popen(command) 

o puedes usar el signal.alarm () si lo quieres con python pero es lo mismo.

Si está utilizando Python 2.6 o posterior, puede usar el módulo de multiprocesamiento .

 from multiprocessing import Process def f(): # Stuff to run your process here p = Process(target=f) p.start() p.join(timeout) if p.is_alive(): p.terminate() 

En realidad, el multiprocesamiento es el módulo incorrecto para esta tarea, ya que es solo una forma de controlar la duración de un subproceso. No tienes control sobre ningún niño que pueda correr el hilo. Como sugiere la singularidad, el uso de signal.alarm es el enfoque normal.

 import signal import subprocess def handle_alarm(signum, frame): # If the alarm is triggered, we're still in the exec_proc.communicate() # call, so use exec_proc.kill() to end the process. frame.f_locals['self'].kill() max_time = ... stdout = stderr = None signal.signal(signal.SIGALRM, handle_alarm) exec_proc = subprocess.Popen(['time', 'ping', '-c', '5', 'google.com'], stdin=None, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) signal.alarm(max_time) try: (stdout, stderr) = exec_proc.communicate() except IOError: # process was killed due to exceeding the alarm finally: signal.alarm(0) # do stuff with stdout/stderr if they're not None 

Uso os.kill () pero no estoy seguro de si funciona en todos los sistemas operativos.
Sigue el pseudo código, y vea la página de Doug Hellman .

 proc = subprocess.Popen(['google-chrome']) os.kill(proc.pid, signal.SIGUSR1)