Python-exit-kommandoer - hvorfor så mange, og hvornår skal de bruges?
Det ser ud til at python understøtter mange forskellige kommandoer til at stoppe scriptudførelsen.
De valgmuligheder jeg har fundet er: quit()
, exit()
, sys.exit()
, os._exit()
Har jeg overset nogen? Hvad er forskellen mellem dem? Hvornår ville du bruge dem hver især?
429
3
Lad mig give nogle oplysninger om dem:
quit()
giver anledning til undtagelsenSystemExit
bag kulisserne.Hvis du udskriver den, vil den desuden give en besked:
Denne funktionalitet blev medtaget for at hjælpe folk, der ikke kender Python. Når alt kommer til alt, er en af de mest sandsynlige ting en nybegynder vil forsøge at afslutte Python ved at skrive
quit
.Ikke desto mindre bør
quit
ikke bruges i produktionskode. Det skyldes, at det kun virker, hvis moduletsite
er indlæst. I stedet bør denne funktion kun bruges i fortolkeren.exit()
er et alias forquit
(eller omvendt). De eksisterer sammen blot for at gøre Python mere brugervenligt.Desuden giver den også en besked, når den udskrives:
Ligesom
quit
ansesexit
dog for at være dårlig at bruge i produktionskode og bør reserveres til brug i fortolkeren. Dette skyldes, at det også er afhængig afsite
-modulet.sys.exit()
udløser undtagelsenSystemExit
i baggrunden. Det betyder, at det er det samme somquit
ogexit
i den henseende.I modsætning til disse to anses
sys.exit
dog for at være god at bruge i produktionskode. Det skyldes, atsys
-modulet altid vil være der.os._exit()
afslutter programmet uden at kalde oprydningshåndterer, flushing stdio buffers, osv. Derfor er det ikke en standard måde at afslutte på og bør kun bruges i særlige tilfælde. Det mest almindelige af disse er i den eller de underordnede processer, der er oprettet afos.fork
.Bemærk, at af de fire angivne metoder er det kun denne metode, der er unik i det, den gør.
Samlet set afslutter alle fire metoder programmet. De to første anses dog for at være dårlige at bruge i produktionskode, og den sidste er en ikke-standardiseret, beskidt metode, som kun bruges i særlige scenarier. Så hvis du ønsker at afslutte et program normalt, skal du vælge den tredje metode:
sys.exit
.Eller, endnu bedre efter min mening, kan du bare gøre direkte hvad
sys.exit
gør bag kulisserne og køre:På denne måde behøver du ikke importere
sys
først.Dette valg er dog blot et stilmæssigt valg og er helt op til dig.
Funktionerne*
quit()
,exit()
ogsys.exit()
fungerer på samme måde: de udløser undtagelsenSystemExit
. Så der er ingen reel forskel, bortset fra atsys.exit()
altid er tilgængelig, menexit()
ogquit()
er kun tilgængelige, hvissite
modulet er importeret.Funktionen
os._exit()
er speciel, den afsluttes med det samme uden at kalde nogen oprydningsfunktioner (den flusher f.eks. ikke buffere). Dette er designet til meget specialiserede brugstilfælde... dybest set kun i barnet efter etos.fork()
kald.Konklusion
Brug
exit()
ellerquit()
i REPL'en.Brug
sys.exit()
i scripts, ellerraise SystemExit()
hvis du foretrækker det.Brug
os._exit()
for underprocesser til at afslutte efter et kald tilos.fork()
.Alle disse kan kaldes uden argumenter, eller du kan angive exit-status, f.eks.
exit(1)
ellerraise SystemExit(1)
for at afslutte med status 1. Bemærk at portable programmer er begrænset til exit status koder i intervallet 0-255, hvis duraise SystemExit(256)
på mange systemer vil dette blive afkortet og din proces vil faktisk afsluttes med status 0.Fodnoter
quit()
ogexit()
instansobjekter, der kan kaldes, men jeg synes det er i orden at kalde dem funktioner.Forskellige metoder til at forlade stedet
os._exit()
:exit(0)
:exit(1)
:sys.exit()
:quit()
:Resumé
I bund og grund gør de alle det samme, men det afhænger også af, hvad du gør det til.
Jeg tror ikke du har udeladt noget, og jeg vil anbefale dig at vænne dig til
quit()
ellerexit()
.Du ville bruge
sys.exit()
ogos._exit()
primært hvis du bruger store filer eller bruger python til at styre terminalen.Ellers skal du primært bruge
exit()
ellerquit()
.