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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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, которые часто не распространяют ошибки.

Ответ 4

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

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

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(), вы должны использовать оператор import в блоке try::

try:
    import myscriptname
except [...]

Лучшее решение, которое не требует дополнительных сценариев-оболочек, заключается в том, чтобы запустить script либо из 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, открыть script и нажать кнопку запуска (F5 или Ctrl+F5, я думаю). Когда script завершается, окно не будет закрываться автоматически, поэтому вы можете увидеть любые ошибки

Кроме того, как предложил Крис Торнхилл, в Windows вы можете создать ярлык для своего script, а в нем Properties префикс цели с помощью

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

Из http://www.computerhope.com/cmd.htm:

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

Ответ 5

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

#!/usr/bin/python -i

На странице man:

-i

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

Ответ 6

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

Dan

Ответ 7

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

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

Ответ 8

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

    import os

    #code here 

    os.system('pause')