终止一个Python脚本

我知道PHP中的die()命令可以提前停止脚本。

我怎样才能在Python中做到这一点?

 import sys sys.exit() 

来自sys模块文档的详细信息:

sys. exit ([ arg ])

从Python退出。 这是通过引发SystemExitexception来实现的,所以try语句的finally子句所指定的清理动作得到遵守,并且可以拦截在外层的退出尝试。

可选参数arg可以是一个给出退出状态(默认为零)的整数或其他types的对象。 如果它是一个整数,零被认为是“成功终止”,任何非零值被shell等认为是“exception终止”。 大多数系统要求它在0-127范围内,否则会产生未定义的结果。 一些系统有一个为特定退出代码指定特定含义的惯例,但是这些系统通常是欠发达的; Unix程序通常使用2作为命令行语法错误,1使用其他types的错误。 如果传递另一种types的对象,则None等同于传递零,而其他任何对象都将打印到stderr并导致退出代码为1.特别是, sys.exit("some error message")是一种快速发生错误时退出程序。

由于exit()最终“唯一”引发了一个exception,它只会在主线程调用时退出进程,并且exception不会被拦截。

请注意,这是退出的“好方法”。 @ glyphtwistedmatrix下面指出,如果你想要一个'硬退出',你可以使用os._exit(errorcode),虽然它可能在某种程度上是特定于操作系统的(例如,它可能不会在Windows下使用错误代码)肯定不那么友好,因为在这个过程死之前,它不会让翻译做任何清理工作。

早期终止Python脚本的简单方法是使用内置函数quit()。 无需导入任何图书馆,而且高效简单。

例:

 #do stuff if this == that: quit() 

另一种方法是:

 raise SystemExit 

虽然你通常应该更喜欢sys.exit因为它对其他代码更“友好”,但实际上所做的只是引发exception。

如果您确定需要立即退出进程,并且您可能在某个可以捕获SystemExitexception处理程序中,还有另一个函数 – os._exit – 它立即在C级别终止,并且不执行任何正常推翻口译员; 例如,注册到“atexit”模块的钩子不会被执行。

你也可以简单地使用exit()

请记住, sys.exit()exit()quit()os._exit(0) Python解释器。 因此,如果它出现在由另一个脚本通过execfile()调用的脚本中,它会停止执行这两个脚本。

请参阅“ 停止执行用execfile调用的脚本 ”以避免这种情况。

 from sys import exit exit() 

作为一个参数,你可以传递一个退出代码,将返回到操作系统。 缺省值是0。

我是一个总新手,但肯定这是更清洁,更受控制

 def main(): try: Answer = 1/0 print Answer except: print 'Program terminated' return print 'You wont see this' if __name__ == '__main__': main() 

程序终止

 import sys def main(): try: Answer = 1/0 print Answer except: print 'Program terminated' sys.exit() print 'You wont see this' if __name__ == '__main__': main() 

程序终止的Traceback(最近一次调用的最后一个):在main()文件“Z:\ Directory \ testdieprogram.py”,第8行,在主sys.exit()中的第12行的文件“Z:\ Directory \ testdieprogram.py” )SystemExit

编辑

重要的是,该scheme平稳而平静地结束,而不是“我已经停止!!!!”

我刚刚发现,当编写一个multithreading应用程序, raise SystemExitsys.exit()都杀死只有正在运行的线程。 另一方面, os._exit()退出整个过程。 这是在这里讨论。

下面的例子有2个线程。 肯尼和卡特曼。 卡特曼应该永远活着,但肯尼是recursion调用,并应在3秒后死亡。 (recursion调用不是最好的方法,但我有其他的原因)

如果我们在肯尼去世的时候也想让卡特曼去死,肯尼应该用os._exit ,否则只有肯尼会死,卡特曼会永远活着。

 import threading import time import sys import os def kenny(num=0): if num > 3: # print("Kenny dies now...") # raise SystemExit #Kenny will die, but Cartman will live forever # sys.exit(1) #Same as above print("Kenny dies and also kills Cartman!") os._exit(1) while True: print("Kenny lives: {0}".format(num)) time.sleep(1) num += 1 kenny(num) def cartman(): i = 0 while True: print("Cartman lives: {0}".format(i)) i += 1 time.sleep(1) if __name__ == '__main__': daemon_kenny = threading.Thread(name='kenny', target=kenny) daemon_cartman = threading.Thread(name='cartman', target=cartman) daemon_kenny.setDaemon(True) daemon_cartman.setDaemon(True) daemon_kenny.start() daemon_cartman.start() daemon_kenny.join() daemon_cartman.join() 

在Python 3.5中,我试图在不使用模块(例如sys,Biopy)的情况下合并类似的代码,而不是使用内置的代码来停止脚本并向用户输出错误消息。 这是我的例子:

 ## My example: if "ATG" in my_DNA: ## <Do something & proceed...> else: print("Start codon is missing! Check your DNA sequence!"); exit(); ## as most folks said above 

后来,我发现只是抛出一个错误就更简洁了:

 ## My example revised: if "ATG" in my_DNA: ## <Do something & proceed...> else: raise ValueError("Start codon is missing! Check your DNA sequence!");