2009-06-22 16 views
10

Czy można przerwać wykonywanie skryptu w języku Python wywołanego funkcją execfile bez użycia instrukcji if/else? Próbowałem już exit(), ale to nie pozwala na zakończenie main.py.Zatrzymaj wykonywanie skryptu wywoływanego przy użyciu execfile

# 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

Dlaczego używasz execfile() i nie importować? – ephemient

+0

Myślę, że execfile pozwala na większą elastyczność, gdy edytuję skrypty w osobnym oknie i wykonuję je w locie – JcMaco

Odpowiedz

15

main można owinąć execfile w try/except bloku. sys.exit zgłasza wyjątek SystemExit który main może złapać w klauzuli except, aby kontynuować normalne wykonywanie, jeśli jest to pożądane. Tj., w main.py:

try: 
    execfile('whatever.py') 
except SystemExit: 
    print "sys.exit was called but I'm proceeding anyway (so there!-)." 
print "so I'll print this, etc, etc" 

i whatever.py mogą korzystać sys.exit(0) lub cokolwiek wypowiedzieć własną tylko wykonanie. Każdy inny wyjątek będzie działał tak długo, jak długo uzgodniono między źródłem, aby być execfile d, a źródłem wykonującym wywołanie execfile - ale SystemExit jest szczególnie odpowiedni, ponieważ jego znaczenie jest całkiem jasne!

+0

To wydaje się być dla mnie hackerem. Chociaż Python jest językiem przyjaznym dla wyjątków ... –

+3

Wychodzenie z kodu liniowego wcześnie wymaga powrotu, kontynuacji, przerwania lub przebicia (sys.exit() jest szczególnym przypadkiem podniesienia). podbicie jest * najmniej * hackish w tym kontekście, IMO. –

+2

@Matthew, Zgadzam się z @Rick: w Pythonie wyjątki nie są aż tak wyjątkowe (jest na przykład StopIteration, na normalnym końcu pętli _every_ for!), Więc użyj jednego, aby zakończyć plik exec'd wykonanie wydaje mi się akceptowalne. –

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(); 

znaleźć tego aspektu Pythonie (The __name__ == "__main__”, itd.), Drażniących

+0

Występują dwa małe błędy w kodzie, który napisałeś: "print" to nie powinno się drukować "" jest wcięte jeden za dużo a powrót nie wymaga średnika. Dzięki, myślę, że wykorzystam to. – JcMaco

+0

Ale wtedy linie są wcięte, co jest tym, czego OP chce uniknąć. Nie rozumiem, dlaczego należy unikać wcięć. –

+0

Naprawiłem wydruk. Trzymam jednak średnik. ;) Ach, jak ja nienawidzę znaczących białych znaków. :) –

1

Co jest nie tak ze zwykłą obsługą wyjątków?

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