2016-02-18 2 views
1

Привет, У меня возникли проблемы с использованием sys.exit в консоли python. Он работает очень хорошо с ipython. Мой код выглядит примерно так:sys.exit в консоли python

if name == "lin": 
    do stuff 
elif name == "static": 
    do other stuff 
else: 
    sys.exit("error in input argument name, Unknown name") 

Если знать программу знают прыжки в цикле еще он ломается и дает мне сообщение об ошибке. Если я использую IPython, все хорошо, но если я использую консоль Python, консоль зависает, и я должен перезапустить ее, что является неудобным.

Я использую Python 2.7 со Spyder на MAC.

Есть ли такое обходное решение, что я код работает в Python и IPython таким же образом? Это проблема с spyder?

Оказание помощи

+0

, что происходит, когда вы пытаетесь 'sys.exit (1)' – danidee

+0

Почему вы хотите, чтобы выйти из консоли? Это имеет смысл, если вы выполняете * программу *, например '$ python myprog.py'. –

+0

Если я использую sys.exit (1), то самое происходит, но сообщение исчезло. Я использую это в функции, которая вычисляет сложную фазу и добавляет ее к данным. Если теперь выбранный метод отсутствует в списке, программа распадается для того, чтобы предотвратить дальнейшее вычисление с помощью нефазированных данных. Поэтому было бы неплохо остановиться и этот момент и дать пользователю (или мне) подсказку, в чем причина. – Glostas

ответ

2

Не уверен, что это то, что вы должны использовать sys.exit для. Эта функция в основном просто генерирует специальное исключение (SystemExit), которое не попадает на REPL python. В основном он выходит из python, и вы возвращаетесь к оболочке терминала. ipython's REPL делает catch SystemExit. Он отображает сообщение, а затем возвращается к REPL.

Вместо использования sys.exit вы должны сделать что-то вроде:

def do_something(name): 
    if name == "lin": 
     print("do stuff") 
    elif name == "static": 
     print("do other stuff") 
    else: 
     raise ValueError("Unknown name: {}".format(name)) 

while True: 
    name = raw_input("enter a name: ") 
    try: 
     do_something(name) 
    except ValueError as e: 
     print("There was a problem with your input.") 
     print(e) 
    else: 
     print("success") 
     break # exit loop 
+0

Это работает. Я надеялся на менее серьезные изменения в коде, но если я думаю, что возьму это – Glostas

+0

Вам не нужен цикл while, если вы используете свой код с REPL. Код будет завершен с исключением, трассировка стека будет напечатана (включая ваше сообщение), а затем REPL предложит вам следующую команду. – Dunes

+0

Очень приятно. Большое спасибо – Glostas

1

Вам необходимо импортировать системные блоки. Следующие работы для меня:

import sys 
name="dave" 
if name == "lin": 
    print "do stuff" 
elif name == "static": 
    print "do other stuff" 
else: 
    sys.exit("error in input argument name, Unknown name") 
+0

Я импортировал sys. Код работает. Но производительность в консоли Python не очень приятная. – Glostas

+0

Извиняюсь, я неправильно понял вопрос. @Dunes ответ ниже отлично imo. – lathonez