it-swarm.cn

终止Python脚本

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

我怎么能用Python做到这一点?

867
Teifion
import sys
sys.exit()

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

sys.exit([arg])

退出Python。这是通过引发 SystemExit exception来实现的,因此可以接受 try statements的finally子句指定的清除操作,并且可以拦截外层的退出尝试。

可选参数 arg 可以是给出退出状态(默认为零)或其他类型对象的整数。如果它是整数,则零被认为是“成功终止”,并且任何非零值被贝壳等视为“异常终止”。大多数系统要求它在0-127范围内,否则会产生不确定的结果。有些系统有一个约定,用于为特定的退出代码分配特定的含义,但这些通常是不发达的; Unix程序通常使用2表示命令行语法错误,1表示所有其他类型的错误。如果传递了另一种类型的对象,则None等效于传递零,并且任何其他对象将打印到 stderr 并导致退出代码为1.特别是,sys.exit("some error message")是一种快速退出程序的方法。发生错误。

由于 exit() 最终“only”引发异常,它只会在从主线程调用时退出进程,并且异常不会被截获。

请注意,这是退出的“不错”方式。 @ glyphtwistedmatrix 下面指出如果你想要一个'硬退出',你可以使用os._exit( errorcode ),虽然它可能在某种程度上是特定于os的(它可能不需要例如,在Windows下的错误代码,它肯定不太友好,因为它不会让解释器在进程死亡之前进行任何清理。

1180
pjz

提前终止Python脚本的一种简单方法是使用内置函数quit()。无需导入任何库,它既高效又简单。

例:

#do stuff
if this == that:
  quit()
258
j.m.g.r

另一种方式是:

raise SystemExit
107
Vhaerun

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

如果您确定需要立即退出进程,并且可能在某个异常处理程序内部会捕获SystemExit,则还有另一个函数os._exit - 它会立即终止于C级并且不执行任何正常的撕裂 - 翻译;例如,不执行使用“atexit”模块注册的挂钩。

62
Glyph

您也可以使用exit()

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

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

58
Space cowboy
from sys import exit
exit()

作为参数,您可以传递退出代码,退出代码将返回给操作系统。默认值为0。

24
cleg

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

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

如果我们也希望卡特曼在肯尼去世时死去,肯尼应该放弃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 __== '__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()
21
eaydin

我是一个新手,但肯定是更干净,更有控制力

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

if __== '__main__': 
    main()

...

程序终止

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

if __== '__main__': 
    main()

...

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

编辑

关键是程序平稳而平静地结束,而不是 “我已经停止!!!!”

15
Floggedhorse

在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!");
6
David C.