如何在不抛出异常的情况下终止python程序?

时间:2016-04-29 16:49:57

标签: python

我问这个是因为我有一些使用锁文件的python代码,我想知道在哪种情况下程序可以终止而不会抛出异常(或以不可操作的方式结束),然后会有没有处理和锁定文件必须手动删除。我想做这样的事情:

try:
    % Check if lock file exists; if not, create it, do some processing, etc...
finally:
    % Process ended --or-- possibly exception thrown; clean up lock file

例如,ctrl + c可以由异常处理,破坏的管道可以由异常处理等...

我能想到程序可以无异常终止的唯一情况是计算机的电源是否被关闭。在这种情况下,我可以编写一个脚本来清除启动时的所有锁文件。还有其他人吗?

编辑:想说“锁定文件”而不是“标记文件”

2 个答案:

答案 0 :(得分:1)

os._exit会立即杀死一个程序,但它的使用非常气馁......

其他情况涉及用户发送SIGKILL(* NIX),或电源关闭或某种操作系统内核恐慌,或者您的计算机不在您的第二个故事窗口中...

请注意,如果您有要删除的锁定文件,则实现相同安全级别的等效(可能更惯用的方式)是使用上下文管理器。 contextlib可以为您提供帮助:

import contextlib

@contextlib.contextmanager
def lock():
    try:
       create_lock()
       yield 'whatever you want'
    finally:
       remove_lock()

用法如下:

with lock() as x:
    assert x == 'whatever you want'
    do_stuff_with_lock_safety()

显然,这并不比您最初使用try/finally的想法更安全(这也是我使用过的) - 但是每次使用的输入次数较少,如果上下文管理器是您用于创建/删除锁定的唯一方式,然后用户不需要记住如何自行清理,因为上下文管理器为您执行此操作

答案 1 :(得分:0)

import sys
sys.exit(status=0)

status - 可选参数arg可以是给出退出状态(默认为零)的整数,或其他类型的对象。 https://docs.python.org/2/library/sys.html#sys.exit

os._exit()消极方面是程序完成而不调用清理处理程序,刷新stdio缓冲区等。