Codes de sortie en Python

207

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 en Python? Combien y en a-t-il? Lesquelles sont importantes?

soleil
la source
1
Où voyez-vous ce message?
Jeremy Cantrell
1
@Jeremy Au bas de PythonWin.
sundeep

Réponses:

223

Ce que vous recherchez dans le script, c'est des appels à sys.exit(). L'argument de cette méthode est renvoyé à l'environnement en tant que code de sortie.

Il est assez probable que le script n'appelle jamais la méthode exit et que 0 est le code de sortie par défaut.

Dave Costa
la source
12
Pas sûr du tout. Sous Unix / Linux, la norme est: exit 0 dans le cas où tout allait bien. Tapez une commande, puis echo $?: Si vous lisez 0, elle est retournée sans erreur. L'idée est d'avoir des tests standards. Si le code xyz.py n'a rencontré aucune erreur, il DEVRAIT retourner 0!
Bruno von Paris
1
Si vous souhaitez modifier le code de sortie, préférez quitter proprement en utilisant la sortie intégrée, voir cette réponse
vidstige
101

De la documentation poursys.exit :

L'argument optionnel arg peut être un entier donnant le statut de sortie (par défaut à zéro), 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 non nulle est considérée comme une «terminaison anormale» par des coques et similaires. La plupart des systèmes exigent qu'il soit compris entre 0 et 127 et produisent autrement des résultats indé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 où les codes de sortie sont utilisés sont dans les scripts shell. Dans 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.

Eigir
la source
3
Dans un autre article, j'ai trouvé ce lien: tldp.org/LDP/abs/html/exitcodes.html Cela pourrait être utile. :)
Eigir
9
errno.h est généralement pour les codes de sortie d'appel de fonction. Les tentatives de normalisation des codes de sortie de programme ont entraîné la présence de /usr/include/sysexits.h sur la plupart des systèmes POSIX.
mpounsett
1
Il est très bon de savoir que "les programmes Unix utilisent généralement 2 pour les erreurs de syntaxe de ligne de commande"!
dantiston
2
@dantiston Concur. Un ardent défenseur de Gentoo teint dans la laine, mais je ne l'ai jamais su ... jusqu'à ce jour fatidique. ( Ma honte se termine maintenant. ) De manière similaire, notez que greprompt cette tendance en quittant avec 1quand aucune ligne ne correspond et 2sur les erreurs réelles. Merci beaucoup, Stallman.
Cecil Curry
32

Pour mémoire, 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
laffuste
la source
3
Selon la documentation, ils ne sont disponibles que sur les systèmes d'exploitation Unix et ne sont donc pas entièrement portables.
phoenix
1
Si vous souhaitez des codes POSIX portables disponibles sur tous les systèmes d'exploitation, consultez le exitstatuspackage PyPI.
phoenix
1
L'intégralité de ce package est 0 pour le succès et 1 pour l'échec.
Pavel Minaev
25

Il existe un errnomodule qui définit les codes de sortie standard:

Par exemple, l' autorisation refusée est le code d'erreur 13 :

import errno, sys

if can_access_resource():
    do_something()
else:
    sys.exit(errno.EACCES)
Oli
la source
36
Ceci est une erreur. Ces erreurs ne sont pas destinées à être utilisées comme codes de sortie de processus. Il s'agit de codes d'erreur de bas niveau destinés à être utilisés en interne dans les programmes, en particulier ceux écrits en langage C. Pour Python, utilisez des exceptions chaque fois que possible.
SvdB
2
Vous avez raison. Ceux-ci doivent être utilisés en interne. Mais vous ne déclenchez normalement pas d'exceptions au niveau de l'utilisateur final. Vous utilisez sys.exit (x) avec x étant un entier que vous choisissez arbitrairement. Mais vous pouvez utiliser ceux commençant par EX_ et définis dans le module 'os'. Comme os.EX_OK ou os.EX_IOERR
Oli
2
Désolé, mais je vote également contre, car c'est trompeur. Les codes d'état de sortie et les numéros d'erreur ne sont pas interchangeables / complémentaires. En utilisant l'exemple donné, «permission refusée» a un code d'erreur de 13 (selon errnoet errno.h ), mais un code d'état de sortie de 77 (selon oset sysexits.h ). Les programmes qui émettent le premier sont non standard ( de facto vel jure ) et ne joueront pas bien avec d'autres qui attendent à juste titre le second.
Mark G.9
14

Les codes de sortie de 0 signifient généralement «rien de mal ici». Cependant, si le programmeur du script n'a pas suivi la convention, vous devrez peut-être consulter la source pour voir ce que cela signifie. Habituellement, une valeur non nulle est renvoyée en tant que code d'erreur.

Sam Corder
la source
6

La réponse est "dépend de ce que signifie le code de sortie zéro"

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 retourne 'OK'

Si mon script python appelle sys.exit(1)(ou n'importe quel entier différent de zéro), le shell retourne 'Pas OK'

Il vous appartient de vous familiariser avec le shell et de lire la documentation (ou la source) de votre script pour voir ce que signifient les codes de sortie.

FlipMcF
la source
Juste pour être complet, 'Pas OK' sera imprimé si le script Python a déclenché une erreur OU une erreur de syntaxe.
Shital Shah
5

Les commandes du système d'exploitation ont des codes de sortie. Recherchez les codes de sortie Linux pour voir des informations à 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 sont déployés pour créer des codes de sortie standard (ou du moins couramment utilisés). Voir cette publication Advanced Script Script .

S.Lott
la source
5

Je recommande un arrêt propre avec la sortie (0) intégrée plutôt que d'utiliser sys.exit ()

Je ne sais pas si c'est un bon conseil.

La documentation 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 donnée) ajoute plusieurs constantes à l'espace de noms intégré. Ils sont utiles pour l'interpréteur interactif et ne doivent pas être utilisés dans les programmes .

Ensuite:

exit (code = Aucun)

Objets qui, une fois imprimés, impriment un message comme «Utilisez quit () ou Ctrl-D (c'est-à-dire EOF) pour quitter», et lorsqu'ils sont appelés, déclenchez SystemExit avec le code de sortie spécifié.

Si nous le comparons à la documentation sys.exit () , il utilise le même mécanisme qui déclenche une SystemExitexception.

chameau faible
la source
5

Si vous souhaitez utiliser de manière portable les codes de sortie POSIX standard , consultez leexitstatus package sur PyPI.

Installez le package:

$ pip install exitstatus

Utilisez dans votre code:

import sys
from exitstatus import ExitStatus

sys.exit(ExitStatus.success)
phénix
la source
4

Les codes de sortie n'ont de sens que ceux attribués par l'auteur du script. La tradition Unix est que le code de sortie 0 signifie «succès», tout le reste est un échec. La seule façon d'être sûr de la signification des codes de sortie pour un script donné est d'examiner le script lui-même.

Harper Shelby
la source
2

Les codes de sortie dans de nombreux langages de programmation dépendent des programmeurs. Vous devez donc regarder le code source de votre programme (ou manuel). Zéro signifie généralement "tout s'est bien passé".

Davide
la source
0

Suivant les codes de sortie Unix 0 - pour succès / OK, 1 - non succès / erreur. Vous pouvez simplement utiliser exit(0)ou exit(1)appeler sans importer de sysmodule.

Lukasz Dynowski
la source
-2

Pour permettre aux gestionnaires d'exceptions et à d'autres choses de s'exécuter, je recommande un arrêt net avec le exit(0)module intégré plutôt que d'utiliser sys.exit()ce qui met fin au processus brusquement.

vidstige
la source
Alors, quelle est la différence? D'où viennent ces informations? Vous voulez dire l'exécution des gestionnaires "à la sortie" ou à quoi faites-vous allusion exactement? SystemExitsemble être soulevé de toute façon.
0xC0000022L
mm, je l'ai confondu avec os._exit, les deux semblent augmenter SystemExit.
vidstige
1
Mauvais: sys.exit() s'arrête proprement, tout comme exit(). Ils font tous les deux la même chose: lever une SystemExitexception. En fait, exit()on entend les sessions interactives, et non pas des scripts, donc sur le plan conceptuel sys.exit() est celui qui est indiqué. Vous pourriez être déroutant os._exit(), c'est celui qui se termine brusquement.
MestreLion