Остановить python от закрытия по ошибке

в python при запуске скриптов есть ли способ остановить закрытие окна консоли после выплевывания обратной трассировки?

8 ответов


Если вы делаете это на ОС Windows, вы можете префикс целевой ярлык с:

C:\WINDOWS\system32\cmd.exe /K <command>

это предотвратит закрытие окна при выходе команды.


try:
    #do some stuff
    1/0 #stuff that generated the exception
except Exception as ex:
    print ex
    raw_input()

вы можете зарегистрировать обработчик исключений верхнего уровня, который поддерживает приложение при возникновении необработанного исключения:

def show_exception_and_exit(exc_type, exc_value, tb):
    import traceback
    traceback.print_exception(exc_type, exc_value, tb)
    raw_input("Press key to exit.")
    sys.exit(-1)

 import sys
 sys.excepthook = show_exception_and_exit

это особенно полезно, если у вас есть исключения, возникающие внутри обработчиков событий, которые вызываются из кода C, которые часто не распространяют ошибки.


у вас может быть второй скрипт, который импортирует/запускает ваш основной код. Этот скрипт поймает все исключения и распечатает трассировку (затем дождитесь ввода пользователя перед завершением)

предполагая, что ваш код структурирован с помощью if __name__ == "__main__": main() идиома..

def myfunction():
    pass

class Myclass():
    pass

def main():
    c = Myclass()
    myfunction(c)

if __name__ == "__main__":
    main()

..и файл называется ...myscriptname.py " (очевидно, что это можно изменить), следующее будет работать

from myscriptname import main as myscript_main

try:
    myscript_main()
except Exception, errormsg:
    print "Script errored!"
    print "Error message: %s" % errormsg
    print "Traceback:"
    import traceback
    traceback.print_exc()
    print "Press return to exit.."
    raw_input()

(обратите внимание, что raw_input() был заменен на input() на Python 3)

если у вас нет main() функция, вы использовали бы положить оператор импорта в try: блок:

try:
    import myscriptname
except [...]

лучшим решением, не требующим дополнительных сценариев-оболочек, является запуск скрипта либо из IDLE, либо из командной строки..

в Windows выберите Пуск > Выполнить, введите cmd и введите. Затем введите что-то вроде..

cd "\Path\To Your\ Script\"
\Python\bin\python.exe myscriptname.py

(если вы установили Python в C:\Python\)

на Linux / Mac OS X это немного проще, вы просто запустите cd /home/your/script/ затем python myscriptname.py

самый простой способ - использовать IDLE, запустить IDLE, открыть скрипт и нажать кнопку run (F5 или Ctrl+F5 я думаю). При выходе скрипта окно не закроется автоматически, поэтому вы можете увидеть любые ошибки

также, как Крис Торнхилл предложил, в Windows, вы можете создать ярлык для вашего скрипта, и в его свойствах префикс цели с..

C:\WINDOWS\system32\cmd.exe /K [existing command]

от http://www.computerhope.com/cmd.htm:

/K command - Executes the specified command and continues running.

в системах UNIX (Windows уже была рассмотрена выше...) вы можете изменить аргумент интерпретатора, чтобы включить флаг-i:

#!/ usr / bin / python-i

из man-страницы:

когда скрипт передается в качестве первого аргумента или используется параметр-c, после выполнения скрипта или команды войдите в интерактивный режим. Он не читает файл $PYTHONSTARTUP. Это может быть полезно для проверки глобальных переменных или в стеке трассировка, когда сценарий вызывает исключение.


в windows вместо двойного щелчка по файлу py вы можете перетащить его в уже открытое окно CMD, а затем нажать enter. Он остается открытым после исключения.

Дэн


ваш вопрос не очень ясен, но я предполагаю, что интерпретатор python выходит (и, следовательно, окно вызывающей консоли закрывается), когда происходит исключение.

вам нужно изменить приложение python, чтобы поймать исключение и распечатать его, не выходя из интерпретатора. Один из способов сделать это-напечатать "нажмите ENTER для выхода", а затем прочитать некоторые входные данные из окна консоли, фактически ожидая, пока пользователь нажмет Enter.


Если вы используете Windows, вы можете сделать это

    import os

    #code here 

    os.system('pause')