【问题标题】:sys.exit in python consolepython控制台中的sys.exit
【发布时间】:2016-02-18 11:29:26
【问题描述】:

您好,我在 python 控制台中使用 sys.exit 时遇到问题。它与 ipython 一起工作非常好。我的代码大致是这样的:

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

如果知道程序知道跳转到 else 循环,它就会崩溃并给我错误消息。如果我使用 IPython,一切都很好,但如果我使用 Python 控制台,控制台会冻结,我必须重新启动它,这有点不方便。

我在 MAC 上使用 Python 2.7 和 Spyder。

是否有一种解决方法可以使我的代码在 Python 和 IPython 中以相同的方式工作?这是 spyder 的问题吗?

感谢您的帮助

【问题讨论】:

  • 当你尝试sys.exit(1)时会发生什么
  • 为什么要退出控制台?这仅在您执行像$ python myprog.py 这样的程序 时才有意义。
  • 如果我使用 sys.exit(1) 会发生同样的情况,但消息消失了。我在一个计算复杂相位并将其添加到数据的函数中使用它。如果现在选择的方法不在列表中,则程序会中断,以防止进一步计算未定相的数据。因此,最好停止这一点并给用户(或我自己)一个提示是什么原因

标签: python ipython spyder


【解决方案1】:

不确定这是否是您应该使用 sys.exit 的目的。这个函数基本上只是抛出一个特殊的异常(SystemExit),它没有被 python REPL 捕获。基本上它退出 python,然后你回到终端 shell。 ipython 的 REPL 确实 捕获 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

【讨论】:

  • 这行得通。我希望对代码进行不太严重的更改,但如果我认为我会接受这个
  • 如果您将代码与 REPL 一起使用,则不需要 while 循环。代码将退出异常,将打印堆栈跟踪(包括您的消息),然后 REPL 将提示您输入下一个命令。
  • 非常不错。非常感谢
【解决方案2】:

你需要导入 sys.以下对我有用:

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")

【讨论】:

  • 我导入了 sys.该代码有效。但是在 Python 控制台中的表现并不好
  • 抱歉,我误解了这个问题。 @Dunes 下面的回答非常棒。
猜你喜欢
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 2011-09-23
  • 1970-01-01
相关资源
最近更新 更多