sys.exit():有一个不那么极端的选择吗?

时间:2013-06-26 05:27:50

标签: python

我希望得到关于sys.exit()使用的一些建议。我使用sys.exit()来阻止脚本继续运行:

我的代码:

if  x != 20:
    query = raw_input("X does not equal 20. Do you want to continue? (Y/N)")
    if query in ['y', 'Y']:
        pass
    else:
        sys.exit()

我已经做了一些搜索(并且仍在搜索),但我希望能够清楚地了解sys.exit()的最佳实践。有没有比杀死剧本更极端的东西?我正在考虑额外循环和更好奇的问题的组合。

3 个答案:

答案 0 :(得分:4)

将代码放在main()函数中:

def main():
    // your code

if __name__ == '__main__':
    main()

然后您可以通过返回

退出脚本

答案 1 :(得分:3)

因为这是在脚本的开头使用的(如你所提到的)。使用下面写的编码模式。并且使用return而不是sys.exit(实际上,因为您从脚本本身退出,因此完全终止该过程sys.exit并不是一个坏习惯)。

您是使用return还是sys.exit返回适当的整数。这是一个很好的做法。

def do_something():
    //process something
    return 1

if __name__ == '__main__':
    query = raw_input("Do you want to continue? (Y/N)")
    if query.lower() == 'y':
        //do something
        do_something()
    else:
        print 'ERROR: Cant Understand Input. It has to be (Y/N). Exiting...'
        return 0

答案 2 :(得分:3)

正如其他评论者所指出的,一个函数为您提供了从脚本中的任何地方使用返回保释的选项,这可能是最好的选择 - 我只是想提到一件琐事:

从技术上讲,sys.exit会引发SystemExit异常。您可以使用普通的try-catch捕获SystemExit,如果您愿意,可以有效地“取消”退出。如果您有更复杂的代码,其中低级函数可能没有足够的上下文来做出正确的决定,但更高级别的代码可能想要介入并清理,这可能会派上用场。

来自C / C ++和许多其他语言的人从这种策略中得到了荨麻疹,但在Pythonland中并不少见。一般情况下,使用异常进行流量控制是个好主意,但如果您正在使用其他人的功能,或者将较小的脚本组合到更大的应用程序中,则可能会有用。

不要忘记,顺便说一句,如果控制权落到你的脚本的底部,那么它无论如何都会返回'无',所以在你的例子中:

if  x != 20:
    query = raw_input("X does not equal 20. Do you want to continue? (Y/N)")
    if query in ['y', 'Y']:
        // do something

相同
if  x != 20:
    query = raw_input("X does not equal 20. Do you want to continue? (Y/N)")
    if query in ['y', 'Y']:
        // do something
    else:
        sys.exit()

除了你可以尝试/捕捉第二个但不是第一个的事实...虽然我假设你的例子是从一个更大的样本剪断,其中返回是更好的逃生路线