Python exit-kommandoer - hvorfor så mange og når bør de brukes?
Det ser ut til at python støtter mange forskjellige kommandoer for å stoppe kjøring av skript: quit()
, exit()
, sys.exit()
, os._exit()
.
Har jeg gått glipp av noen? Hva er forskjellen mellom dem? Når vil du bruke hver av dem?
429
3
La meg gi litt informasjon om dem:
quit()
utløser unntaket `SystemExit
bak kulissene.Hvis du skriver den ut, vil den dessuten gi en melding:
Denne funksjonaliteten ble inkludert for å hjelpe folk som ikke kan Python. Tross alt er noe av det mest sannsynlige en nybegynner vil prøve å avslutte Python ved å skrive
quit
.Likevel bør
quit
ikke brukes i produksjonskode. Den fungerer nemlig bare hvis modulensite
er lastet inn. I stedet bør denne funksjonen bare brukes i fortolkeren.exit()
er et alias forquit
(eller omvendt). De eksisterer sammen for å gjøre Python mer brukervennlig.Dessuten gir den også en melding når den skrives ut:
I likhet med
quit
erexit
imidlertid ansett som dårlig å bruke i produksjonskode og bør reserveres for bruk i tolken. Dette er fordi den også er avhengig avsite
-modulen.sys.exit()
utløser unntaketSystemExit
i bakgrunnen. Det betyr at den er den samme somquit
ogexit
i så måte.I motsetning til disse to anses imidlertid
sys.exit
som god å bruke i produksjonskode. Dette er fordisys
-modulen alltid vil være der.os._exit()
avslutter programmet uten å kalle oppryddingsbehandlere, skylle stdio-buffere osv. Det er derfor ikke en standard måte å avslutte på, og bør bare brukes i spesielle tilfeller. Det vanligste av disse er i underprosessen(e) som opprettes avos.fork
.Legg merke til at av de fire metodene som er oppgitt, er det bare denne som er unik i det den gjør.
Oppsummert avslutter alle fire metodene programmet. De to første anses imidlertid som dårlige å bruke i produksjonskode, og den siste er en ikke-standard, skitten måte som bare brukes i spesielle scenarier. Så hvis du vil avslutte et program på vanlig måte, bør du bruke den tredje metoden:
sys.exit
.Eller, enda bedre etter min mening, du kan bare gjøre direkte det
sys.exit
gjør bak kulissene og kjøre:På denne måten trenger du ikke å importere
sys
først.Dette er imidlertid bare et stilvalg og er helt opp til deg.
Funksjonene*
quit()
,exit()
ogsys.exit()
fungerer på samme måte: de utløser unntaketSystemExit
. Det er altså ingen reell forskjell, bortsett fra atsys.exit()
alltid er tilgjengelig, mensexit()
ogquit()
bare er tilgjengelige hvissite
-modulen er importert.Funksjonen
os._exit()
er spesiell, den avslutter umiddelbart uten å kalle opprydningsfunksjoner (den skyller for eksempel ikke buffere). Den er laget for svært spesialiserte bruksområder... i utgangspunktet bare i barnet etter etos.fork()
-kall.Konklusjon
Bruk
exit()
ellerquit()
i REPL.Bruk
sys.exit()
i skript, ellerraise SystemExit()
hvis du foretrekker det.Bruk
os._exit()
for underordnede prosesser som skal avsluttes etter et kall tilos.fork()
.Alle disse kan kalles uten argumenter, eller du kan spesifisere avslutningsstatusen, f.eks.
exit(1)
ellerraise SystemExit(1)
for å avslutte med status 1. Vær oppmerksom på at portable programmer er begrenset til exit-statuskoder i området 0-255. Hvis du kallerraise SystemExit(256)
på mange systemer, vil denne koden bli avkortet, og prosessen avsluttes med status 0.Fotnoter
quit()
ogexit()
kallbare instansobjekter, men jeg synes det er greit å kalle dem funksjoner.Forskjellige måter å gå ut på
os._exit()
:exit(0)
:exit(1)
:sys.exit()
:quit()
:Sammendrag
I utgangspunktet gjør de alle det samme, men det avhenger også av hva du gjør det for.
Jeg tror ikke du har utelatt noe, og jeg vil anbefale deg å venne deg til
quit()
ellerexit()
.Du vil bruke
sys.exit()
ogos._exit()
hovedsakelig hvis du bruker store filer eller bruker python til å styre terminalen.Ellers bruker du hovedsakelig
exit()
ellerquit()
.