在Python中退出时如何捕获信号并传递变量?

时间:2018-09-13 16:42:42

标签: python signals

我正在尝试捕获信号并将变量传递给退出处理程序。

我现在使用的Python3信号处理signal.signal(signal.SIGINT, exit_handler)无法传递变量。

这是我的代码:

import signal

def main(driver):
  ""
  # somecode

def exit_handler(sig, frame):
    driver.quit()
    db.update
    # etc
    exit()

if __name__ == '__main__':
    driver = ""
    database = ""
    signal.signal(signal.SIGINT, exit_handler) # pass variable to exit_handler
    exit()

如何实现?

2 个答案:

答案 0 :(得分:0)

处理程序必须是一个可调用对象,该对象在调用时需要两个参数(信号号和当前当前堆栈帧)。您可以通过定义__call__方法来编写自己的对象来模拟可调用对象,并且该对象的构造函数采用一个或多个参数,可以在以后调用该参数时保留这些参数。例如:

import signal
import time

def main():
    while True:
        time.sleep(1)

class MyHandler:
    def __init__(self, myvar):
        self.myattr = myvar
    def __call__(self, signo, frame):
        print("My variable was:", self.myattr)

if __name__ == '__main__':
    signal.signal(signal.SIGINT, MyHandler(123))
    main()

如果存储在处理程序实例中的所需值也可以在脚本的生命周期内进行更新,以在调用脚本时使用。

答案 1 :(得分:0)

另一种选择是使用 lambda 函数,并在闭包中传递变量:

import signal
import time

def handler(signum, frame, arg1, arg2):
  print(arg1)
  print(arg2)
  exit(1)

signal.signal(signal.SIGINT, lambda signum, frame: handler(signum, frame, 'foo', 'bar'))

while True:
  time.sleep(1)