如何在python中的os.kill()函数之后执行finally块

时间:2017-02-13 09:17:12

标签: python operating-system

主程序

import os,pymsgbox
try:
    c=os.getpid()
    with open("sample.txt","w") as fp:
        fp.write(str(c))
    while True:
        print ""
except Exception,e:
    print  e
finally:
    pymsgbox.alert("Done")

实际杀死进程的文件

import os,signal
with open("sample.txt","r") as fp:
    pid=fp.read()
os.kill(int(pid),signal.SIGTERM)

在finally块中我想关闭所有打开的连接。那么如何调用finally块

1 个答案:

答案 0 :(得分:1)

试过这个:

import atexit
def final_sub():
    pymsgbox.alert("Done")

atexit.register(final_sub)

atexit模块定义了一个用于注册清理功能的函数。更多信息可以在这里找到:atexit — Exit handlers

也..而不是调用atexit.register,你可以通过装饰器做同样的事情:

@atexit.register
def final_sub():
    pymsgbox.alert("Done")

但是,有一个讨论here 通过它,atexit可能不适用于您的情况。所以你需要SIGTERM信号的处理程序。

尝试在文件的开头添加此代码,并且“finally”在SIGTERM上开始工作。 Hadler在SIGTERM上引发了正常的SystemExit,所以最后工作:

import signal
class SigTerm(SystemExit): pass
def sigterm(sig,frm): raise SigTerm
signal.signal(15,sigterm)

所以,完整的代码将是这样的:

import os
import pymsgbox

import signal
class SigTerm(SystemExit): pass 
def sigterm(sig,frm): raise SigTerm 
signal.signal(15,sigterm)

def final_sub():
    pymsgbox.alert("Done")

try:
    c=os.getpid()
    with open("sample.txt","w") as fp:
        fp.write(str(c))
    while True:
        print("")

except Exception as e:
    print(e)

finally:
    final_sub()