终止一个Python脚本
我知道PHP中的die()
命令可以提前停止脚本。
我怎样才能在Python中做到这一点?
import sys sys.exit()
来自sys
模块文档的详细信息:
sys. exit ([ arg ])
从Python退出。 这是通过引发
SystemExit
exception来实现的,所以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。
如果您确定需要立即退出进程,并且您可能在某个可以捕获SystemExit
exception处理程序中,还有另一个函数 – 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 SystemExit
和sys.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!");