Python: Pourquoi `sys.exit (msg)` appelé depuis un thread n'imprime pas `msg` sur stderr?

StackOverflow https://stackoverflow.com/questions/1209155

Question

Aujourd'hui, je me suis heurté au fait que sys.exit () appelé à partir d'un thread enfant ne tue pas le processus principal. Je ne le savais pas auparavant et tout va bien, mais il m'a fallu beaucoup de temps pour m'en rendre compte. Cela aurait permis à d'économiser beaucoup de temps si sys.exit (msg) avait imprimé msg sur stderr . Mais ce n’est pas le cas.

Il s’est avéré que ce n’était pas un vrai bogue dans mon application; il a appelé sys.exit (msg) avec une erreur significative de manière volontaire - mais je ne pouvais tout simplement pas le voir.

dans la documentation pour sys.exit () il est indiqué : "[...] tout autre objet est imprimé dans sys.stderr et génère un code de sortie de 1" 1 "

Cela est faux pour un appel depuis un thread enfant, où sys.exit () se comporte évidemment comme thread.exit () : "et déclenchez l'exception SystemExit. Le thread quittera alors le silence "

Je pense que lorsqu'un programmeur veut que sys.exit (msg) imprime un message d'erreur, il doit alors être imprimé - indépendamment de l'endroit d'où il est appelé. Pourquoi pas? Je ne vois actuellement aucune raison. Dans la documentation, il devrait au moins y avoir un indice pour sys.exit () que le message n'est pas imprimé à partir de threads.

Qu'en penses-tu? Pourquoi les messages d'erreur sont-ils cachés des threads? Est-ce que cela a du sens?

Cordialement,

Jan-Philip Gehrcke

Était-ce utile?

La solution

Je conviens que les documents Python sont incorrects, ou peut-être plus précisément incomplets, en ce qui concerne sys.exit et SystemExit lorsqu'ils sont appelés / générés par des threads autres que le principal; ouvrez un numéro de document sur le suivi en ligne de Python afin de pouvoir le résoudre lors d'une prochaine itération de la documentation (probablement dans un avenir proche. Les correctifs de documentation sont plus faciles et plus fluides que ceux de code; -).

Bien sûr, le remède est assez simple - il vous suffit d’envelopper toute fonction que vous utilisez comme cible d’un threading.Thread avec un décorateur qui effectue un essai . / sauf SystemExit, e: autour de celui-ci et exécute le message "write to stderr "" fonctionnalité supplémentaire dont vous avez besoin (ou, peut-être mieux, utilise plutôt un appel logging.error) avant de terminer. Mais, avec le problème de documentation que vous avez correctement souligné, il est difficile d’envisager de le faire tant que le problème n’a pas été résolu et qu’il a en fait fallu consacrer un certain temps au débogage pour le cerner, car vous avez dû le faire. do (au nom collectif des principaux développeurs de python - désolé!).

Autres conseils

Tous les threads en python ne sont pas égaux. L'appel de sys.exit à partir d'un thread ne quitte pas réellement le système. Par conséquent, appeler sys.exit () à partir d'un thread enfant n'a aucun sens, il est donc logique qu'il ne se comporte pas comme prévu.

Cette page en dit plus sur les objets de thread, et sur les différences entre les threads et les spécial " main " fil.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top