Domanda

Ho ricevuto un messaggio che diceva lo script xyz.py ha restituito il codice di uscita 0 . Cosa significa?

Cosa significano i codici di uscita in Python? Quanti sono lì? Quali sono importanti?

È stato utile?

Soluzione

Quello che stai cercando nello script sono le chiamate a sys.exit () . L'argomento di quel metodo viene restituito all'ambiente come codice di uscita.

È abbastanza probabile che lo script non stia mai chiamando il metodo di uscita e che 0 sia il codice di uscita predefinito.

Altri suggerimenti

Da la documentazione per sys.exit :

  

L'argomento facoltativo arg può essere un   numero intero che indica lo stato di uscita   (impostazione predefinita a zero) o un altro tipo   dell'oggetto. Se è un numero intero, zero   è considerato "terminazione riuscita"   e viene considerato qualsiasi valore diverso da zero   "Terminazione anomala" da parte di shell e   il simile. La maggior parte dei sistemi lo richiede   essere compreso nell'intervallo 0-127 e produrre   risultati non definiti altrimenti. Alcuni   i sistemi hanno una convenzione per   assegnando significati specifici a   codici di uscita specifici, ma questi sono   generalmente sottosviluppato; Unix   i programmi generalmente usano 2 per il comando   errori di sintassi della linea e 1 per tutti gli altri   tipo di errori.

Un esempio di utilizzo dei codici di uscita è rappresentato dagli script della shell. In bash puoi controllare la variabile speciale $? per l'ultimo stato di uscita:

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

Personalmente provo ad usare i codici di uscita che trovo in /usr/include/asm-generic/errno.h (su un sistema Linux), ma non so se questo è il cosa giusta da fare.

Esiste un modulo errno che definisce l'uscita standard codici:

Ad esempio, Autorizzazione negata è il codice di errore 13 :

import errno, sys

if can_access_resource():
    do_something()
else:
    sys.exit(errno.EACCES)

Per la cronaca, è possibile utilizzare i codici di uscita standard POSIX definiti qui .

Esempio:

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

I codici di uscita pari a 0 in genere significano, "qui non c'è nulla di sbagliato." Tuttavia, se il programmatore dello script non ha seguito la convenzione, potrebbe essere necessario consultare la fonte per vedere cosa significa. Di solito viene restituito un valore diverso da zero come codice di errore.

I comandi del sistema operativo hanno codici di uscita. Cerca codici di uscita di Linux per vedere del materiale su questo. La shell utilizza i codici di uscita per decidere se il programma ha funzionato, ha avuto problemi o non è riuscito. Ci sono alcuni sforzi per creare codici di uscita standard (o almeno comunemente usati). Vedi questo post Advanced Shell Script .

Se desideri utilizzare in modo portabile i codici di uscita POSIX standard , vedi il pacchetto exitstatus su PyPI.

Installa il pacchetto:

pip install exitstatus

Usa nel tuo codice:

import sys
from exitstatus import ExitStatus

sys.exit(ExitStatus.success)

I codici di uscita hanno significato solo come assegnati dall'autore dello script. La tradizione Unix è che il codice di uscita 0 significa "successo", qualsiasi altra cosa è un fallimento. L'unico modo per essere sicuri del significato dei codici di uscita per un determinato script è esaminare lo script stesso.

La risposta è " dipende da cosa significa zero codice di uscita "

Tuttavia, nella maggior parte dei casi, ciò significa "Tutto ok"


Mi piace POSIX:

Quindi, sulla shell, scriverei:

python script.py & amp; & amp; echo "OK" || echo "Non OK"

Se il mio script python chiama sys.exit (0) la shell restituisce 'OK'

Se il mio script python chiama sys.exit (1) (o qualsiasi numero intero diverso da zero), la shell restituisce 'Not OK'

È tuo compito diventare intelligente con la shell e leggere la documentazione (o l'origine) dello script per vedere cosa significano i codici di uscita.

  

Raccomando un arresto pulito con exit (0) incorporato anziché utilizzare sys.exit ()

Non sono sicuro che si tratti di un buon consiglio.

La stessa documentazione menzionata legge:

  

Il modulo del sito (che viene importato automaticamente all'avvio, tranne se viene fornita l'opzione della riga di comando -S) aggiunge diverse costanti allo spazio dei nomi incorporato. Sono utili per la shell dell'interprete interattivo e non dovrebbero essere usati nei programmi .

Quindi:

  

exit (codice = None)

     

Oggetti che una volta stampati, stampano un messaggio del tipo "Usa quit () o Ctrl-D (cioè EOF) per uscire" e, quando chiamato, sollevano SystemExit con il codice di uscita specificato.

Se lo confrontiamo con sys.exit () documentazione, utilizza lo stesso meccanismo che genera un'eccezione SystemExit .

I codici di uscita in molti linguaggi di programmazione sono a carico dei programmatori. Quindi devi guardare il codice sorgente del tuo programma (o manuale). Zero di solito significa "tutto è andato bene".

Per consentire l'esecuzione di gestori di eccezioni e altre cose, raccomando un arresto pulito con exit (0) incorporato anziché utilizzare sys.exit () che interrompe bruscamente il processo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top