J'ai reçu un message disant script xyz.py returned exit code 0
. Qu'est-ce que ça veut dire?
Que signifient les codes de sortie dans Python? Combien y en a-t-il? Lesquels sont importants?
Ce que vous recherchez dans le script, ce sont des appels à sys.exit()
. L'argument de cette méthode est renvoyé à l'environnement en tant que code de sortie.
Il est fort probable que le script n'appelle jamais la méthode exit et que 0 soit le code de sortie par défaut.
De la documentation pour sys.exit
:
L'argument optionnel arg peut être un entier indiquant le statut de sortie (zéro par défaut) ou un autre type d'objet. S'il s'agit d'un entier, zéro est considéré comme une "terminaison réussie" et toute valeur autre que zéro est considérée comme une "terminaison anormale" par les shells et similaires. La plupart des systèmes exigent qu'il soit compris entre 0 et 127 et produisent sinon des résultats non définis. Certains systèmes ont une convention pour attribuer des significations spécifiques à des codes de sortie spécifiques, mais ceux-ci sont généralement sous-développés; Les programmes Unix utilisent généralement 2 pour les erreurs de syntaxe de ligne de commande et 1 pour tous les autres types d’erreurs.
Un exemple d'utilisation de codes de sortie concerne les scripts Shell. En bash, vous pouvez vérifier la variable spéciale $?
pour le dernier statut de sortie:
me@mini:~$ python -c ""; echo $?
0
me@mini:~$ python -c "import sys; sys.exit(0)"; echo $?
0
me@mini:~$ python -c "import sys; sys.exit(43)"; echo $?
43
Personnellement, j'essaie d'utiliser les codes de sortie que je trouve dans /usr/include/asm-generic/errno.h
(sur un système Linux), mais je ne sais pas si c'est la bonne chose à faire.
Il existe un module errno
qui définit les codes de sortie standard:
Par exemple, L'autorisation refusée correspond à un code d'erreur 13 :
import errno, sys
if can_access_resource():
do_something()
else:
sys.exit(errno.EACCES)
Pour l’enregistrement, vous pouvez utiliser les codes de sortie standard POSIX définis ici .
Exemple:
import sys, os
try:
config()
except:
sys.exit(os.EX_CONFIG)
try:
do_stuff()
except:
sys.exit(os.EX_SOFTWARE)
sys.exit(os.EX_OK) # code 0, all ok
Les codes de sortie de 0 signifient généralement "rien de mal ici." Cependant, si le programmeur du script ne suit pas les conventions, vous devrez peut-être consulter la source pour voir ce que cela signifie. Généralement, une valeur non nulle est renvoyée sous forme de code d'erreur.
Les commandes du système d'exploitation ont des codes de sortie. Cherchez codes de sortie linux pour voir du matériel à ce sujet. Le shell utilise les codes de sortie pour décider si le programme a fonctionné, a rencontré des problèmes ou a échoué. Des efforts ont été faits pour créer des codes de sortie standard (ou du moins couramment utilisés). Voir ceci Advanced Shell Script posts.
Si vous souhaitez utiliser de manière portable le codes de sortie POSIX standard , voir le paquet exitstatus sur PyPI.
Installez le paquet:
pip install exitstatus
Utilisez dans votre code:
import sys
from exitstatus import ExitStatus
sys.exit(ExitStatus.success)
Les codes de sortie n'ont que la signification attribuée par l'auteur du script. La tradition Unix veut que le code de sortie 0 signifie 'succès', tout ce qui reste est un échec. Le seul moyen de vérifier le sens des codes de sortie d'un script consiste à examiner le script lui-même.
La réponse est "Cela dépend de ce que le code de sortie zéro signifie"
Cependant, dans la plupart des cas, cela signifie "Tout va bien"
J'aime POSIX:
Donc, sur le shell, je taperais:
python script.py && echo 'OK' || echo 'Not OK'
Si mon script python appelle sys.exit(0)
, le shell renvoie "OK".
Si mon script python appelle sys.exit(1)
(ou tout autre entier différent de zéro), le shell renvoie "Pas OK".
Il est de votre devoir de vous débrouiller avec Shell et de lire la documentation (ou le code source) de votre script pour voir ce que signifient les codes de sortie.
Je recommande un arrêt complet avec l'exit (0) intégré plutôt que d'utiliser sys.exit ()
Je ne suis pas sûr que ce soit un bon conseil.
La documentation même mentionnée se lit comme suit:
Le module de site (qui est importé automatiquement au démarrage, sauf si l'option de ligne de commande -S est indiquée) ajoute plusieurs constantes à l'espace de nom intégré. Ils sont utiles pour l'interpréteur interactif Shell et ne doivent pas être utilisés dans des programmes .
Ensuite:
exit (code = None)
Les objets qui, une fois imprimés, impriment un message du type "Utilisez quit () ou Ctrl-D (c'est-à-dire EOF) pour quitter" et, lorsqu'ils sont appelés, soulèvent SystemExit avec le code de sortie spécifié.
Si nous le comparons à sys.exit () documentation, il utilise le même mécanisme que celui qui déclenche une exception SystemExit
.
Les codes de sortie dans de nombreux langages de programmation appartiennent aux programmeurs. Donc, vous devez regarder votre code source du programme (ou manuel). Zéro signifie généralement "tout s'est bien passé".
Pour autoriser les gestionnaires d'exceptions et autres opérations, je recommande un arrêt complet avec la commande intégrée exit(0)
plutôt que d'utiliser sys.exit()
qui termine le processus de façon abrupte.