Python, Timeout of Try, Except Statement después de X número de segundos?

He estado buscando esto, pero parece que no puedo encontrar una respuesta exacta (la mayoría se mete en cosas más complicadas como multihilo, etc.), solo quiero hacer algo como una statement Try, Except donde si el proceso no termina dentro de X número de segundos lanzará una excepción.

EDITAR: La razón de esto es que estoy usando un software de prueba de sitio web (selenium) con una configuración que a veces hace que se cuelgue. No produce un error, no se agota el tiempo ni hace nada, así que no tengo forma de detectarlo. Me pregunto cuál es la mejor manera de determinar si esto ha ocurrido para poder seguir adelante con mi aplicación, por lo que estaba pensando si podría hacer algo como “si esto no ha terminado X segundos … siga adelante” .

La respuesta (y la pregunta) no es específica de la statement try / except. Si quieres tener un bucle infinito que no es infinito (pero se detiene después de un tiempo), probablemente no debería ser infinito. Por ejemplo, cámbielo para usarlo:

 while time <= some_value: 

O agregue un cheque adicional al cuerpo del bucle, haciendo que se rompa cuando desee que se detenga:

 while True: ... if time > some_value: break 

Si eso no es posible (por ejemplo, porque no controla el bucle en absoluto), las cosas se ponen mucho más difíciles. En muchos sistemas, puede usar signal.alarm para recibir una señal después de un período de tiempo, y luego tener un controlador de señal para signal.SIGALRM que genera su excepción TimeoutError . Eso puede o no funcionar dependiendo de lo que realmente haga el bucle infinito; Si bloquea las señales, o detecta e ignora las excepciones, o de alguna otra manera interfiere con el manejador de señales, eso no funcionará. Otra posibilidad sería no hacer el bucle en el proceso actual, sino en uno separado; A continuación, puede terminar el proceso por separado a su antojo. Sin embargo, no será fácil hacer nada, pero terminarlo, por lo que la limpieza o recuperación de un trabajo parcial es muy difícil. (Los hilos no van a funcionar en absoluto, porque no hay forma de interrumpir el hilo separado haciendo el bucle infinito).

No puede hacerlo sin algún tipo de subprocesamiento múltiple o multiprocesamiento, incluso si está oculto bajo algunas capas de abstracción, a menos que el “proceso” que está ejecutando esté diseñado específicamente para la asincronía y vuelva a llamar a una función conocida de vez en cuando .

Si describe qué es realmente ese proceso, será más fácil proporcionar soluciones reales. No creo que aprecies el poder de Python cuando se trata de implementaciones que son sucintas mientras se completa. Esto puede tomar solo unas pocas líneas de código para implementar, incluso si se usa multihilo / multiproceso.

Una solución genérica si está utilizando UNIX:

 import time as time import signal #Close session def handler(signum, frame): print 1 raise Exception('Action took too much time') signal.signal(signal.SIGALRM, handler) signal.alarm(3) #Set the parameter to the amount of seconds you want to wait try: #RUN CODE HERE for i in range(0,5): time.sleep(1) except: print 2 signal.alarm(10) #Resets the alarm to 10 new seconds signal.alarm(0) #Disables the alarm