2009-06-22 3 views
10

Возможно ли прервать выполнение скрипта Python с функцией execfile без использования инструкции if/else? Я пробовал exit(), но он не позволяет завершить main.py.Остановить выполнение скрипта с 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

Почему вы используете ExecFile(), а не импортировать? – ephemient

+0

Я думаю, что execfile обеспечивает большую гибкость, когда я редактирую скрипты в отдельном окне и выполняю их на лету. – JcMaco

ответ

15

main может обернуть execfile в блок try/except:. sys.exit вызывает исключение SystemExit который main может улавливать в предложении except, чтобы продолжить его выполнение, если это необходимо, т.е., если это необходимо. Т.е. в 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" 

и whatever.py могут использовать sys.exit(0) или независимо от того, чтобы прекратить свою собственную только исполнение. Любое другое исключение будет работать так же долго, как это было согласовано между источником execfile d, и источник, делающий вызов execfile, - но SystemExit особенно подходит, поскольку его значение довольно ясное!

+0

Это похоже на взлом для меня. Хотя Python - это язык, который не подходит для исключения ... –

+3

Для выхода из линейного кода требуется один из вариантов возврата, продолжения, перерыва или рейза (sys.exit() является особым случаем рейза). рейз - это наименее хакерский в этом контексте, ИМО. –

+2

@Matthew, я согласен с @Rick: в Python исключения не являются исключительными (есть один, StopIteration, в обычном конце цикла _every_ for, например!), Поэтому используйте один для завершения exec'd-файла исполнение кажется приемлемым для меня. –

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

Я считаю, этот аспект Python (The __name__ == "__main__»и т.д.) раздражая

+0

В коде, который вы отправили, есть две небольшие ошибки: «print» это не должно печатать »« слишком сильно отстутнут и возврат не нужен точкой с запятой. Спасибо, я думаю, что буду использовать это. – JcMaco

+0

Но тогда линии имеют отступы, которые OP хочет избежать. Я не понимаю, почему этого отступов следует избегать. –

+0

Я установил печать. Я держу полуколону, хотя. ;) Ах, как я ненавижу значительные пробелы. :) –

1

Что случилось с простой старой обработкой исключений?

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