当前位置:  开发笔记 > 编程语言 > 正文

终止Python脚本

如何解决《终止Python脚本》经验,为你挑选了9个好方法。

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

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



1> pjz..:
import sys
sys.exit()

sys模块文档中的详细信息:

sys.exit([arg])

退出Python.这是通过引发SystemExit异常来实现的 ,因此最终的try语句子句指定的清理操作得到遵守,并且可以拦截外层的退出尝试.

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

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

请注意,这是退出的"好方法".@ glyphtwistedmatrix低于指出,如果你想要一个"硬退出",你可以使用os._exit(错误代码),但它很可能与操作系统相关的在一定程度上(也许它不会在Windows下一个错误代码,例如),它肯定是不太友好,因为它不会让解释程序在进程死亡之前进行任何清理.


有没有办法在不引发异常的情况下结束脚本?我已经将脚本中的相关标志传递给了pdn,并将stdout输出到了Popen中,因此这种情况下的异常会导致比解决方案更多的麻烦.
假设`sys.exit()`不起作用(不会杀死进程,只是杀死线程)如果由后台线程引发?
为什么,当我使用这种方法时,我会得到以下警告:```UserWarning:要退出:使用'exit','quit'或Ctrl-D.警告("退出:使用'退出','退出'或Ctrl-D.",stacklevel = 1)```

2> j.m.g.r..:

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

例:

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


sys.exit()也会终止所有python脚本,但是quit()只会终止产生它的脚本.
你知道这个命令在python 2和python 3中的工作方式是否有所不同?
对我来说,“退出”未定义。我正在使用python 3。

3> Vhaerun..:

另一种方式是:

raise SystemExit


@Alessa:它看起来更优雅,但不推荐:你直接提出内置异常而不是更好的(和可覆盖的)`sys.exit`包装器

4> 小智..:

你也可以简单地使用exit().

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

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



5> Glyph..:

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

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



6> eaydin..:

我刚刚发现了写multithreadded的应用程序时,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 __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()



7> cleg..:
from sys import exit
exit()

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


就我而言,我什至不需要导入出口。

8> Floggedhorse..:

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

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

编辑

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


一个问题是,如果你在嵌套函数中并且只想退出,你要么必须一直发送一个标志回到顶部函数,否则你将只返回到下一级别.
如果您试图建议您可以使用`return`来终止脚本,这绝对是一个废话.所有`return`正在做的是返回一个值和一个控制流到调用函数.在调用`return`函数后,它继续执行.当然,如果`return`是脚本中的最后一个语句,就像在你的例子中那样,那么脚本在调用后立即终止.

9> David C...:

在Python 3.5中,我尝试在不使用模块(例如sys,Biopy)的情况下合并类似的代码,而不是内置的内容来停止脚本并向用户输出错误消息.这是我的例子:

## My example:
if "ATG" in my_DNA: 
    ## 
else: 
    print("Start codon is missing! Check your DNA sequence!");
    exit(); ## as most folks said above

后来,我发现抛出错误更简洁:

## My example revised:
if "ATG" in my_DNA: 
    ## 
else: 
    raise ValueError("Start codon is missing! Check your DNA sequence!");

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有