如何早期退出脚本,就像PHP中的die()
命令一样?
import sys
sys.exit()
来自 sys
模块文档 的详细信息:
sys.exit([arg])
退出 Python。这是通过抛出
SystemExit
异常来实现的,因此会执行由try
语句中的 finally 子句指定的清理操作,并且可以在外层拦截退出尝试。可选参数 arg 可以是一个整数,表示退出状态(默认为零),或者是另一种类型的对象。如果它是一个整数,则零被视为“正常终止”,任何非零值都被视为“异常终止”并被 shell 等程序认为是错误的。大多数系统要求它在 0-127 范围内,否则会产生未定义的结果。一些系统有将特定的退出代码分配给具体含义的约定,但这些通常不太完善;Unix 程序通常使用 2 表示命令行语法错误,使用 1 表示其他所有类型的错误。如果传递了另一种类型的对象,则 None 等价于传递零,并且会将任何其他对象打印到
stderr
并导致退出代码为 1。特别地,sys.exit("some error message")
是在发生错误时退出程序的快捷方式。由于
exit()
最终“只”抛出异常,所以仅在从主线程调用时才能退出进程,并且该异常不会被拦截。
请注意,这是一种“优雅”的退出方式。@glyphtwistedmatrix在下面指出,如果您想实现“强制退出”,可以使用os._exit(*errorcode*)
,尽管它可能在某种程度上是特定于操作系统的(例如,在Windows下可能无法接受错误代码),并且它肯定不那么友好,因为它在进程死亡之前不会让解释器进行任何清理。另一方面,它确实杀死整个进程,包括所有正在运行的线程,而sys.exit()
(如文档所述)仅在从主线程调用且没有其他线程运行时才会退出。
sys.exit()
不起作用(不会终止进程,只会终止该线程)吗? - user607021sys.exit()
在当前线程中引发了SystemExit
异常。 - Dmitry TrofimovTkinter
,它将不会停止根进程mainLoop
和它所显示的窗口。为此,您需要额外添加一行root.destroy()
。 - Roy Hinkleyquit()
函数是提前终止Python脚本的简单方法。无需导入任何库,它既高效又简单。#do stuff
if this == that:
quit()
另一种方法是:
raise SystemExit
sys.exit
包装器。 - MestreLionexit()
。sys.exit()
、exit()
、quit()
和os._exit(0)
会终止Python解释器。因此,如果它出现在通过execfile()
从另一个脚本调用的脚本中,则会停止两个脚本的执行。quit()
或 exit()
。这些函数仅适用于交互式Python。请参阅 Python退出命令-为什么有这么多,每个应该何时使用?。 - pabouk - Ukraine stay strong虽然通常应该优先使用 sys.exit
,因为它对其他代码更加“友好”,但它实际上只是引发异常。
如果您确定需要立即退出进程,并且可能在某些异常处理程序内部,这些处理程序将捕获 SystemExit
,那么还有另一个函数 - os._exit
- 可以在 C 级别立即终止进程,并且不执行解释器的任何正常拆卸操作;例如,“atexit”模块注册的钩子不会被执行。
os._exit()
是唯一能够正确终止作业且不产生错误的方法。 - Jérémyos._exit()
会在不进行任何清理的情况下退出整个进程。由于在AWS中,运行的VM实例将在作业结束时被丢弃,因此这对我来说不是问题。 - Jérémyraise SystemExit
和sys.exit()
只会终止当前运行的线程。另一方面,os._exit()
会终止整个进程。这在《为什么在Python中在线程内调用sys.exit()时不退出?》中有讨论。os._exit
,否则只有 Kenny 会死亡,而 Cartman 将永远存在。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()
from sys import exit
exit()
作为参数,您可以传递一个退出代码,该代码将返回给操作系统。默认值为0。
exit()
和sys.exit()
并不相同。在脚本中不要使用内置的exit()
,这只是交互式Shell的辅助工具-请使用sys.exit()
。 - daveruinseverything我完全是个新手,但这肯定更加简洁、可控。
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()
程序终止 跟踪(最近的调用在最上面): 文件 "Z:\Directory\testdieprogram.py",第12行,在main()函数中 文件 "Z:\Directory\testdieprogram.py",第8行,在main()函数中 sys.exit() SystemExit
编辑
关键在于程序平稳、安静地结束,而不是"我已经停止了!!!"
return
来终止脚本,那么这完全是胡说八道。所有 return
所做的只是返回一个值和控制流到调用函数。然后在调用 return
的函数之后立即继续执行。当然,如果 return
是你脚本中的最后一个语句,就像你的例子一样,那么脚本会在它被调用后立即终止。 - David Ferenczy Rogožanmain
方法并运行到完成。我认为在可用时应该优先采用这种方法。 - scign在我的实践中,有一次需要从这些进程之一中杀死整个多处理器应用程序。
如果应用程序只使用一个主进程,则以下函数运行良好。但在我的情况下,由于应用程序还有许多其他正在运行的进程,以下任何一个函数都无法正常工作。
quit()
exit(0)
os._exit(0)
sys.exit(0)
os.kill(os.getppid(), 9)
- 其中os.getppid()
是父进程的pid最后一个函数可以杀死主进程和它本身,但是其余的进程仍然存活。
我不得不通过外部命令杀死它,最终找到了使用pkill
的解决方案。
import os
# This can be called even in process worker and will kill
# whole application included correlated processes as well
os.system(f"pkill -f {os.path.basename(__file__)}")
在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!")
import os
ĺ’Śos._exit()
。 - Amin Pial