我们目前正在我们的unix环境中迁移到SSH和Kerberos身份验证方案。我需要在脚本中断,出现错误或脚本成功执行的任何时候在我们所有的自动python脚本中发出Kerberos OS命令。我知道在bash中你可以在退出时陷阱,但从我的研究来看,python中没有这个功能。我的尝试是使用try / except / else块和工作,但不会捕获直接进程杀死并发出命令。我绝不是一个python专家,所以有谁知道一个更好的方法来解决这个或一个函数?此外,这只适用于调用main函数的简单脚本,我的一些脚本是面向对象的,而且更复杂,我的方法也无法工作。这是我尝试一个简单的循环。有什么建议吗?
def main():
while (True):
print "Interrupt Me..."
def watchForInterrupts(x):
#define function to issue kdestroy command
def issueKdestroy():
import os
os.system("kdestroy -q")
print "issued kdestroy"
try:
x()
except:
print "interrupted, issuing kdestroy"
#call issueKdestroy function if interrupted
issueKdestroy()
#else block to issue kdestroy if script completed successfully
else:
print "executed successfully, issuing cleanup kdestroy"
issueKdestroy()
#call watchForInterrupts function with main passed as a parameter
watchForInterrupts(main)
答案 0 :(得分:1)
尝试使用此模块:
http://docs.python.org/2/library/atexit.html
它定义了一种设置关闭挂钩的更方便的方法。
import atexit
@atexit.register
def goodbye():
print "You are now leaving the Python sector."
干净,呵呵?
答案 1 :(得分:0)
我建议使用finally
def watchForInterrupts(x):
...
try:
x()
finally:
# Clean up no matter what happens in try part of block
issueKdestroy()
如果需要,您可以针对各种例外采取具体行动
def watchForInterrupts(x):
...
try:
x()
except KeyboardInterrupt:
print "User requested termination, cleaning up"
except SystemExit:
# You may want to re-raise this
print "Program terminated abnormally"
else:
print "Executed sucessfully"
finally:
# Clean up no matter what happens in try part of block
issueKdestroy()
您还应避免except
而不指定例外。例如,如果您在被调用函数中有一个SyntaxError,它将被异常处理程序捕获,并且您不会收到警告。
答案 2 :(得分:0)
在另一个答案的基础上,使用try ... finally并添加一个信号处理程序,以确保在发出SIGQUIT时最终调用。
import signal
import os
import sys
def callKdestroy():
print "call kdestroy"
def signal_handler(signum, frame):
# ensures unwinding of Python execution.
print "got signal"
sys.exit(1)
signal.signal(signal.SIGTERM, signal_handler)
try:
...
finally:
callKdestroy()