2009-07-30 22 views
8

Hoy corrí en contra del hecho de que sys.exit() llamado desde un hilo hijo no mata el proceso principal. No sabía esto antes, y está bien, pero necesitaba mucho tiempo para darme cuenta de esto. Se habría guardado mucho tiempo, si sys.exit(msg) hubiera impreso msg a stderr. Pero no lo hizo.Python: ¿Por qué `sys.exit (msg)` llamado desde un hilo no imprime `msg` en stderr?

Resultó que no era un error real en mi aplicación; llamó sys.exit(msg) con un error significativo de una manera volitiva, pero no pude ver esto.

In the docs for sys.exit() it is stated: "[...] cualquier otro objeto que se visualiza como sys.stderr y da como resultado un código de salida de 1"

Esto no es cierto para una llamada de un niño-hilo, donde sys.exit(), obviamente, se comporta como thread.exit(): "elevar la excepción SystemExit Cuando no se detecta, esto hará que el hilo para salir en silencio ."

Creo que cuando un programador quiere sys.exit(msg) para imprimir un mensaje de error, debe imprimirse, independientemente del lugar desde donde se lo llama. Por qué no? Actualmente no veo ningún motivo. Al menos debe haber una pista en los documentos para sys.exit() de que el mensaje no se imprime desde los hilos.

¿Qué opinas? ¿Por qué los mensajes de error están ocultos en los hilos? ¿Esto tiene sentido?

Saludos,

Jan-Philip Gehrcke

Respuesta

6

Estoy de acuerdo en que los documentos de Python son incorrectos, o quizás más precisamente incompletos, con respecto a sys.exit y SystemExit cuando son llamados/generados por hilos que no sean el principal; abra un tema de doc en el rastreador en línea de Python para que pueda abordarlo en una futura iteración de los documentos (probablemente uno próximo en el futuro; las correcciones de doc son más fáciles y más suaves que las correcciones de código ;-).

El remedio es bastante fácil, por supuesto - sólo envolver cualquier función que esté utilizando como blanco de un threading.Thread con un decorador que hace un try/except SystemExit, e: alrededor de ella, y que realiza el "escribir en stderr" funcionalidad adicional necesita (o, mejor aún, usa una llamada logging.error en su lugar) antes de finalizar. Pero, con el problema del documento que señalas correctamente, es difícil pensar en hacer eso a menos y hasta que uno se haya encontrado con el problema y de hecho haya tenido que pasar un tiempo en la depuración para precisarlo, ya que has tenido que hacer (en nombre colectivo de los desarrolladores de Python centrales, ¡lo siento!).

+0

Usted me dio un buen consejo, otra vez;) Btw: Es tan bueno que comparta su conocimiento aquí. ¡Veo que actualmente gastas mucho de tu tiempo para llenar esta plataforma con cosas puramente expertas de Python!Esto es lo que la comunidad necesita, pero eso no es una cuestión de rutina. Muchísimas gracias por esto Jan-Philip –

+0

@ Jan-Philip, eres bienvenido, y, gracias por las felicitaciones, siempre es genial escuchar que estoy siendo de ayuda. –

0

No todos los hilos en Python son iguales. Llamar a sys.exit desde un hilo, en realidad no sale del sistema. Por lo tanto, llamar a sys.exit() desde un subproceso secundario no tiene sentido, por lo que tiene sentido que no se comporte de la manera esperada.

Este page habla más sobre el enhebrado de objetos y las diferencias entre los hilos y el hilo especial "principal".

Cuestiones relacionadas