首页 文章

终止Python脚本

提问于
浏览
788

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

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

10 回答

  • 1078

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

    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行,在主sys.exit中()SystemExit

    编辑

    关键是该计划顺利和平地结束,而不是 "I'VE STOPPED !!!!"

  • 53

    另一种方式是:

    raise SystemExit
    
  • 16

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

    例:

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

    虽然你通常应该更喜欢 sys.exit ,因为它比其他代码更多_118258_,但它实际上只是引发异常 .

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

  • 25

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

    以下示例有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 __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()
    
  • 236
    import sys
    sys.exit()
    

    来自sys module documentation的详细信息:

    sys.exit([arg])从Python退出 . 这是通过引发SystemExit异常来实现的,因此可以遵循try语句的finally子句指定的清理操作,并且可以拦截外层的退出尝试 . 可选参数arg可以是一个整数,给出退出状态(默认为零)或其他类型的对象 . 如果它是整数,则零被认为是“成功终止”,并且任何非零值被贝壳等视为“异常终止” . 大多数系统要求它在0-127范围内,否则会产生不确定的结果 . 有些系统具有为特定退出代码指定特定含义的约定,但这些通常是不发达的; Unix程序通常使用2表示命令行语法错误,1表示所有其他类型的错误 . 如果传递了另一种类型的对象,则None等效于传递零,并且任何其他对象将打印到stderr并导致退出代码为1.特别是,sys.exit(“一些错误消息”)是一种快速方法发生错误时退出程序 . 由于exit()最终“仅”引发异常,因此它只会在从主线程调用时退出进程,并且异常不会被截获 .

    请注意,这是退出的'nice'方式 . @ glyphtwistedmatrix下面指出,如果你想要一个'hard exit',你可以使用os._exit(错误代码),虽然它让解释器在进程死之前进行任何清理 .

  • 16

    在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!");
    
  • 104

    尝试在循环后使用break然后使用quit()或exit() .

  • 6

    您也可以使用 exit() .

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

    请参阅“Stop execution of a script called with execfile”以避免这种情况 .

  • 0
    from sys import exit
    exit()
    

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

相关问题