我如何退出一个脚本早,像die()命令在PHP?
当前回答
提前终止Python脚本的一个简单方法是使用内置的quit()函数。不需要导入任何库,而且高效简单。
例子:
#do stuff
if this == that:
quit()
其他回答
import sys
sys.exit()
详细信息来自sys模块文档:
sys.exit ((arg)) 退出Python。这是通过提高 SystemExit异常,因此清理操作由finally子句指定 的try语句被执行,并且可以拦截 试图从外部退出。 可选参数arg可以是给出退出状态的整数 (默认为0),或其他类型的对象。如果是整数, 零被认为是“成功终止”,任何非零值都是 shell等认为是“异常终止”。大多数系统 要求它在0-127的范围内,并产生未定义的结果 否则。一些系统有分配特定 具体退出码的含义,但这些通常是 不发达;Unix程序通常使用2作为命令行语法 Errors和1表示所有其他类型的错误。如果是其他类型的对象 传递,None等效于传递零,而任何其他对象是 打印到stderr并导致退出代码为1。特别是, sys。Exit ("some error message")是一种快速退出程序的方法 出现错误。 由于exit()最终“仅”引发异常,因此它只会退出 进程从主线程调用,而异常不是 拦截。
注意,这是一种“不错”的退出方式。下面的@glyphtwistedmatrix指出,如果你想要一个“硬退出”,你可以使用os._exit(*errorcode*),尽管在某种程度上它可能是特定于os的(例如,它可能不会在windows下接受errorcode),而且它肯定不太友好,因为它不让解释器在进程死亡之前做任何清理。另一方面,它会杀死整个进程,包括所有正在运行的线程,而sys.exit()(就像它在文档中说的那样)只在主线程调用时退出,没有其他线程在运行。
只要把quit()放在代码的末尾,就可以关闭一个python脚本。
我刚刚发现,在编写多线程应用程序时,引发SystemExit和sys.exit()都只杀死正在运行的线程。另一方面,os._exit()退出整个进程。这在“为什么在Python线程中调用sys.exit()时不退出?”中讨论过。
下面的例子有两个线程。肯尼和卡特曼。卡特曼应该永远活着,但肯尼被递归调用,应该在3秒后死亡。(递归调用不是最好的方式,但我有其他原因)
如果我们也想让卡特曼在肯尼死的时候死,肯尼就应该带着os走。退出,否则,只有肯尼会死,卡特曼会永生。
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()
而您通常应该更喜欢sys。退出,因为它对其他代码更“友好”,它实际上所做的只是引发一个异常。
如果你确定你需要立即退出一个进程,并且你可能处于某个异常处理程序中,这个异常处理程序会捕获SystemExit,那么还有另一个函数——os。_exit——它在C级立即终止,不执行任何正常的解释器分解;例如,在"atexit"模块中注册的钩子不会被执行。
也可以简单地使用exit()。
请记住sys.exit(), exit(), quit()和os._exit(0)会杀死Python解释器。因此,如果它出现在execfile()从另一个脚本调用的脚本中,它将停止两个脚本的执行。
请参见“停止执行使用execfile调用的脚本”以避免这种情况。
推荐文章
- 如何删除Python中的前导空白?
- python中的assertEquals和assertEqual
- 如何保持Python打印不添加换行符或空格?
- 为什么Python的无穷散列中有π的数字?
- Python 3.7数据类中的类继承
- 如何在PyTorch中初始化权重?
- 计数唯一的值在一列熊猫数据框架像在Qlik?
- 使用Pandas将列转换为行
- 从matplotlib中的颜色映射中获取单个颜色
- 将Pandas或Numpy Nan替换为None以用于MysqlDB
- 使用pandas对同一列进行多个聚合
- 使用Python解析HTML
- django MultiValueDictKeyError错误,我如何处理它
- 如何在for循环期间修改列表条目?
- 我如何在Django中创建一个鼻涕虫?