Остановить питон от закрытия при ошибке - PullRequest
15 голосов
/ 23 апреля 2009

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

Ответы [ 9 ]

16 голосов
/ 23 апреля 2009

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

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

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

15 голосов
/ 23 апреля 2009
try:
    #do some stuff
    1/0 #stuff that generated the exception
except Exception as ex:
    print ex
    raw_input()
13 голосов
/ 23 апреля 2009

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

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

7 голосов
/ 23 апреля 2009

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

Предполагается, что ваш код структурирован с использованием идиомы 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(), вы должны использовать оператор import в блоке 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, открыть скрипт и нажать кнопку запуска (думаю, 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.
4 голосов
/ 23 апреля 2009

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

#! / Usr / bin / python -i

со страницы руководства:

-i

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

2 голосов
/ 09 января 2013

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

Dan

0 голосов
/ 11 апреля 2019

Посмотрите на ответ на этот вопрос: Как найти код выхода или причину, когда в Python вызывается обратный вызов atexit?

Вы можете просто скопировать этот класс ExitHooks, затем настроить собственную функцию foo и зарегистрировать ее в atexit.

import atexit
import sys, os

class ExitHooks(object):
    def __init__(self):
        self.exit_code = None
        self.exception = None

    def hook(self):
        self._orig_exit = sys.exit
        sys.exit = self.exit
        sys.excepthook = self.exc_handler

    def exit(self, code=0):
        self.exit_code = code
        self._orig_exit(code)

    def exc_handler(self, exc_type, exc, *args):
        self.exception = exc

hooks = ExitHooks()
hooks.hook()

def goodbye():
    if not (hooks.exit_code is None and hooks.exception is None):
        os.system('pause')
#       input("\nPress Enter key to exit.")

atexit.register(goodbye)
0 голосов
/ 18 октября 2016

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

    import os

    #code here 

    os.system('pause')
0 голосов
/ 23 апреля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...