2009-06-22 5 views
10

Ist es möglich, die Ausführung eines mit der execfile-Funktion aufgerufenen Python-Skripts zu unterbrechen, ohne eine if/else-Anweisung zu verwenden? Ich habe versucht exit(), aber es erlaubt main.py nicht zu beenden.Ausführung eines mit execfile aufgerufenen Skripts stoppen

# main.py 
print "Main starting" 
execfile("script.py") 
print "This should print" 

# script.py 
print "Script starting" 
a = False 

if a == False: 
    # Sanity checks. Script should break here 
    # <insert magic command>  

# I'd prefer not to put an "else" here and have to indent the rest of the code 
print "this should not print" 
# lots of lines below 
+0

Warum Sie verwenden execfile() und nicht importieren? – ephemient

+0

Ich denke execfile ermöglicht mehr Flexibilität, wenn ich die Skripte in einem separaten Fenster bearbeite und sie im laufenden Betrieb ausführe – JcMaco

Antwort

15

main die execfile in einen try/except Block wickeln kann. sys.exit wirft eine Systemexit Ausnahme welches main in der except Klausel einfangen kann, um seine Ausführung normalerweise fortzusetzen, wenn gewünscht, das heißt in main.py:

und whatever.py verwenden können sys.exit(0) oder was auch immer nur seine eigene Ausführung zu beenden. Jede andere Ausnahme funktioniert so lange, wie zwischen der Quelle execfile d und der Quelle, die den Aufruf execfile ausführt, vereinbart wurde - aber SystemExit ist besonders geeignet, da ihre Bedeutung ziemlich klar ist!

+0

Das scheint wie ein Hack für mich. Obwohl Python eine ausnahmegerechte Sprache ist ... –

+3

Wenn Sie früh von linearem Code ausgehen, müssen Sie entweder return, continue, break oder raise (sys.exit() ist ein Sonderfall von raise). Raise ist in diesem Zusammenhang das * mindeste * hackish, IMO. –

+2

@Matthew, ich stimme @Rick zu: In Python sind Ausnahmen nicht so außergewöhnlich (es gibt einen, StopIteration, am normalen Ende von _every_ for loop zum Beispiel!), Also benutze einen, um die exec'd-Datei zu beenden die Ausführung scheint mir akzeptabel zu sein. –

3
# script.py 
def main(): 
    print "Script starting" 
    a = False 

    if a == False: 
     # Sanity checks. Script should break here 
     # <insert magic command>  
     return; 
     # I'd prefer not to put an "else" here and have to indent the rest of the code 
    print "this should not print" 
    # lots of lines bellow 

if __name__ == "__main__": 
    main(); 

ich diesen Aspekt der Python finden (die __name__ == "__main__“, etc.) zu reizen

+0

Es gibt zwei kleine Fehler in dem Code, den Sie gepostet: "print" sollte nicht drucken "" ist zu viel eingerückt und Rückkehr benötigt kein Semikolon. Danke, ich denke ich werde das benutzen. – JcMaco

+0

Aber dann sind die Zeilen eingerückt, was das OP vermeiden möchte. Ich verstehe nicht, warum dieses Einrücken zu vermeiden ist. –

+0

Ich reparierte den Druck. Ich behalte aber das Semikolon. ;) Ah, wie ich signifikante Leerzeichen hasse. :) –

1

Was ist los mit der einfachen alten Ausnahmebehandlung?

scriptexit.py

class ScriptExit(Exception): pass 

main.py

from scriptexit import ScriptExit 
print "Main Starting" 
try: 
    execfile("script.py") 
except ScriptExit: 
    pass 
print "This should print" 

script.py

from scriptexit import ScriptExit 
print "Script starting" 
a = False 

if a == False: 
    # Sanity checks. Script should break here 
    raise ScriptExit("A Good Reason") 

# I'd prefer not to put an "else" here and have to indent the rest of the code 
print "this should not print" 
# lots of lines below 
Verwandte Themen