Ho ricevuto un messaggio che diceva script xyz.py returned exit code 0
. Cosa significa questo?
Cosa significano i codici di uscita in Python? Quanti sono lì? Quali sono importanti?
Ho ricevuto un messaggio che diceva script xyz.py returned exit code 0
. Cosa significa questo?
Cosa significano i codici di uscita in Python? Quanti sono lì? Quali sono importanti?
Risposte:
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.
Dalla documentazione persys.exit
:
L'argomento facoltativo arg può essere un numero intero che fornisce lo stato di uscita (impostazione predefinita a zero) o un altro tipo di oggetto. Se è un numero intero, zero è considerato "terminazione riuscita" e qualsiasi valore diverso da zero è considerato "terminazione anomala" da shell e simili. La maggior parte dei sistemi richiede che sia compreso nell'intervallo 0-127 e che altrimenti produca risultati indefiniti. Alcuni sistemi hanno una convenzione per assegnare significati specifici a codici di uscita specifici, ma questi sono generalmente sottosviluppati; I programmi Unix usano generalmente 2 per gli errori di sintassi della riga di comando e 1 per tutti gli altri tipi di errori.
Un esempio in cui vengono utilizzati i codici di uscita sono gli script di 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 /usr/include/asm-generic/errno.h
(su un sistema Linux), ma non so se questa è la cosa giusta da fare.
grep
interrompe questa tendenza uscendo con 1
quando nessuna linea corrisponde e 2
su errori reali. Grazie mille, Stallman.
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
exitstatus
pacchetto PyPI.
C'è un errno
modulo che definisce i codici di uscita standard:
Ad esempio, l' autorizzazione negata è il codice di errore 13 :
import errno, sys
if can_access_resource():
do_something()
else:
sys.exit(errno.EACCES)
errno
e errno.h ), ma un codice di stato di uscita di 77 (secondo os
e sysexits.h ). I programmi che emettono i primi non sono standard ( di fatto ) e non funzionano bene con gli altri che si aspettano giustamente i secondi.
I codici di uscita pari a 0 in genere significano "qui non c'è niente 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.
La risposta è "Dipende dal significato del codice di uscita zero"
Tuttavia, nella maggior parte dei casi, ciò significa "Tutto ok"
Mi piace POSIX:
Quindi, sulla shell, scriverei:
python script.py && echo 'OK' || echo 'Not 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 'Non OK'
Il tuo compito è diventare intelligente con la shell e leggere la documentazione (o l'origine) dello script per vedere cosa significano i codici di uscita.
I comandi del sistema operativo hanno codici di uscita. Cerca i 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 invio avanzato di script di shell .
Raccomando un arresto pulito con exit (0) incorporato anziché utilizzare sys.exit ()
Non sono sicuro che questo sia un buon consiglio.
La stessa documentazione citata recita:
Il modulo del sito (che viene importato automaticamente durante l'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 .
Poi:
uscita (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 la documentazione di sys.exit () , utilizza lo stesso meccanismo che genera SystemExit
un'eccezione.
Se si desidera utilizzare in modo portabile i codici di uscita POSIX standard , consultare il exitstatus
pacchetto 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.
Seguendo i codici di uscita unix 0 - per successo / OK, 1 - non riuscito / errore. Puoi semplicemente usare exit(0)
o exit(1)
chiamare senza importare il sys
modulo.
Per consentire l'esecuzione di gestori di eccezioni e altre cose, raccomando un arresto pulito con l' exit(0)
integrato anziché utilizzare il sys.exit()
quale interrompe bruscamente il processo.
SystemExit
sembra essere sollevato in entrambi i modi.
os._exit
, entrambi sembrano alzare SystemExit
.
sys.exit()
fa l' arresto in modo pulito, proprio come exit()
. Entrambi fanno la stessa cosa: sollevare SystemExit
un'eccezione. In realtà, exit()
è pensato per le sessioni interattive, non per gli script, quindi concettualmente sys.exit()
è quello indicato. Potresti essere confuso os._exit()
, è quello che termina bruscamente.