¿Cómo se agota el tiempo de espera al ejecutar progtwigs de línea de comandos en Python?

Estoy ejecutando Maple desde Python y me gustaría detener el progtwig si supera un tiempo máximo. Si es una función de Python, esto puede hacerse usando un decorador de tiempo de espera. Pero no estoy seguro de cómo hacerlo para las llamadas de línea de comandos. Aquí está el pseudocódigo

import os import timeit as tt t1 = tt.default_timer() os.system('echo path_to_maple params') t2 = tt.default_timer() dt = t2 - t1 

Justo a tiempo este progtwig, todo funciona bien. Sin embargo, el progtwig de arce lleva mucho tiempo, por lo que me gustaría definir un tiempo de maxt, verificar si t1 <maxtime y luego dejar que el programa se ejecute de otra manera no. es decir, cambiar el script a algo como esto:

 import sys maxtime = 10 # seconds t1 = tt.default_timer() if (t1 < maxtime): os.system('echo path_to_maple params') t2 = tt.default_timer() dt = t2 - t1 else: sys.exit('Timeout') 

Por el momento esto no está funcionando. ¿Hay una mejor manera de hacer esto?

Puedes usar subprocess.Popen para generar un proceso hijo. Asegúrese de manejar stdout y stderr correctamente. Luego use Popen.wait(timeout) call y TimeoutExpired el proceso cuando llegue TimeoutExpired .

Use subprocess.Popen() para hacer su oferta, si está usando la versión de Python anterior a 3.3, tendrá que manejar el tiempo de espera usted mismo, aunque:

 import subprocess import sys import time # multi-platform precision clock get_timer = time.clock if sys.platform == "win32" else time.time timeout = 10 # in seconds # don't forget to set STDIN/STDERR handling if you need them... process = subprocess.Popen(["maple", "args", "and", "such"]) current_time = get_timer() while get_timer() < current_time + timeout and process.poll() is None: time.sleep(0.5) # wait half a second, you can adjust the precision if process.poll() is None: # timeout expired, if it's still running... process.terminate() # TERMINATE IT! :D 

En Python 3.3+ es tan fácil como llamar: subprocess.run(["maple", "args", "and", "such"], timeout=10)

Creo que puedes usar

threading.Timer(TIME, function , args=(,))

Para ejecutar la función después de un retraso