it-swarm-eu.dev

Ukončení skriptu Python

Jsem si vědoma příkazu die() v PHP, který skript zastaví brzy.

Jak to mohu udělat v Pythonu?

867
Teifion
import sys
sys.exit()

podrobnosti z dokumentace sys module :

sys.exit([arg])

Ukončete program Python. To je realizováno zvýšením SystemExit výjimka, takže jsou vyčištěny akce čištění specifikované konečnými klauzulemi try příkazů a je možné zachytit pokus o odchod na vnější úrovni.

Volitelný argument arg může být celé číslo udávající stav výstupu (výchozí hodnota je nula) nebo jiný typ objektu. Pokud se jedná o celé číslo, nula se považuje za „úspěšné ukončení“ a jakákoliv nenulová hodnota se pokládá za „abnormální ukončení“ skořápkami a podobně. Většina systémů vyžaduje, aby se nacházela v rozsahu 0-127, a jinak nevytváří výsledky. Některé systémy mají konvenci pro přiřazení specifických významů specifickým výstupním kódům, ale ty jsou obecně nedostatečně rozvinuté; Unix programy obecně používají 2 pro chyby syntaxe příkazového řádku a 1 pro všechny ostatní druhy chyb. Pokud je předán jiný typ objektu, žádný je ekvivalentní předávání nuly a jakýkoli jiný objekt je vytištěn do stderr a výsledkem je výstupní kód 1. Zejména sys.exit("some error message") je rychlý způsob ukončení programu, když je dojde k chybě.

Vzhledem k tomu, že exit() nakonec „pouze“ vyvolá výjimku, bude proces ukončen pouze tehdy, když bude zavolán z hlavního vlákna a výjimka nebude zachycena.

Všimněte si, že toto je cesta „Nice“. @ glyphtwistedmatrix níže ukazuje, že pokud chcete 'hard exit', můžete použít os._exit ( errorcode ). například kód chyby pod okny), a to je určitě méně přátelské, protože neumožňuje tlumočníkovi provést žádné čištění před tím, než proces zemře.

1180
pjz

Jednoduchý způsob, jak ukončit skript Python brzy, je použití vestavěné funkce quit (). Není třeba importovat žádnou knihovnu a je efektivní a jednoduchá.

Příklad:

#do stuff
if this == that:
  quit()
258
j.m.g.r

Jiný způsob je:

raise SystemExit
107
Vhaerun

I když byste měli obecně dávat přednost sys.exit, protože je více "přátelský" k jinému kódu, vše, co vlastně dělá, je vyvolat výjimku.

Pokud jste si jisti, že potřebujete okamžitě ukončit proces a můžete být uvnitř nějakého obslužného programu výjimek, který by zachytil SystemExit, existuje další funkce - os._exit - která okamžitě končí na úrovni C a neprovádí žádnou z normálních slz. - překlad tlumočníka; například háčky registrované s modulem "atexit" nejsou prováděny.

62
Glyph

Můžete také použít jednoduše exit().

Mějte na paměti, že sys.exit(), exit(), quit() a os._exit(0) kill Pythonův interpret. Pokud se tedy objeví ve skriptu volaném z jiného skriptu execfile(), zastaví provádění obou skriptů.

Viz " Zastavit provádění skriptu s názvem execfile ", aby se tomu zabránilo.

58
Space cowboy
from sys import exit
exit()

Jako parametr můžete předat kód ukončení, který bude vrácen do operačního systému. Výchozí hodnota je 0.

24
cleg

Právě jsem zjistil, že při psaní vícevláknové aplikace raise SystemExit a sys.exit() oba zabíjí pouze běžící vlákno. Na druhou stranu os._exit() opouští celý proces. To bylo diskutováno tady.

Níže uvedený příklad obsahuje 2 podprocesy. Kenny a Cartman. Cartman by měl žít věčně, ale Kenny je nazýván rekurzivně a měl by zemřít po 3 sekundách. (rekurzivní volání není nejlepší způsob, ale měl jsem jiné důvody)

Chceme-li také, aby Cartman zemřel, když Kenny zemře, Kenny by měl odejít s os._exit, jinak jen Kenny zemře a Cartman bude žít navždy.

import threading
import time
import sys
import os

def kenny(num=0):
    if num > 3:
        # print("Kenny dies now...")
        # raise SystemExit #Kenny will die, but Cartman will live forever
        # sys.exit(1) #Same as above

        print("Kenny dies and also kills Cartman!")
        os._exit(1)
    while True:
        print("Kenny lives: {0}".format(num))
        time.sleep(1)
        num += 1
        kenny(num)

def cartman():
    i = 0
    while True:
        print("Cartman lives: {0}".format(i))
        i += 1
        time.sleep(1)

if __== '__main__':
    daemon_kenny = threading.Thread(name='kenny', target=kenny)
    daemon_cartman = threading.Thread(name='cartman', target=cartman)
    daemon_kenny.setDaemon(True)
    daemon_cartman.setDaemon(True)

    daemon_kenny.start()
    daemon_cartman.start()
    daemon_kenny.join()
    daemon_cartman.join()
21
eaydin

Jsem naprosto nováček, ale určitě je to čistší a kontrolované

def main():
    try:
        Answer = 1/0
        print  Answer
    except:
        print 'Program terminated'
        return
    print 'You wont see this'

if __== '__main__': 
    main()

...

Program byl ukončen

než

import sys
def main():
    try:
        Answer = 1/0
        print  Answer
    except:
        print 'Program terminated'
        sys.exit()
    print 'You wont see this'

if __== '__main__': 
    main()

...

Program byl ukončen Traceback (poslední volání poslední): Soubor "Z: Adresář programprogram.py", řádek 12, v hlavním souboru () Soubor "Z: Adresář softwareprogram.py", řádek 8, v hlavním sys.exit ( ) SystemExit

Upravit

Cílem je, aby program končil hladce a pokojně, spíše než "Já jsem se zastavil !!!!"

15
Floggedhorse

V Pythonu 3.5 jsem se snažil začlenit podobný kód bez použití modulů (např. Sys, Biopy), než je to, co je zabudováno pro zastavení skriptu a tisk chybových zpráv mým uživatelům. Zde je můj příklad:

## My example:
if "ATG" in my_DNA: 
    ## <Do something & proceed...>
else: 
    print("Start codon is missing! Check your DNA sequence!");
    exit(); ## as most folks said above

Později jsem zjistil, že je stručnější, když zavrhneme chybu:

## My example revised:
if "ATG" in my_DNA: 
    ## <Do something & proceed...>
else: 
    raise ValueError("Start codon is missing! Check your DNA sequence!");
6
David C.