捕获SIGINT并在对象中调用方法

时间:2014-10-21 17:25:40

标签: python methods call sigint

我知道如何在Python中捕获SIGINT / SIGTERM信号,但我发现的所有示例都非常原始。当SIGINT或SIGTERM出现时,我需要在对象中调用指定的方法,有什么方法可以实现它吗?

def sigint_handler(signum, frame):
    print 'Stop pressing the CTRL+C!'

signal.signal(signal.SIGINT, sigint_handler)

class MyObject:
    def terminate (self):
        do_something()

当我尝试向sigint_handler添加另一个参数时,我收到错误。

1 个答案:

答案 0 :(得分:2)

我不确定你为什么要添加这部分

  

当我尝试向sigint_handler添加另一个参数时,我收到错误。

你的问题,但我首先要说明的是:

使用wrapperpartial(这是一个包装工厂),如下所示:

>>> def my_wrapped_sigint_handler(my_argument):
...   def signal_handler(signum, frame): # the actual sigint handler
...      print(my_argument) # or do something useful
...   return signal_handler
... 
>>> signal.signal(signal.SIGINT, my_wrapped_sigint_handler('FOO'))

或使用partial:

>>> from functools import partial
>>> def sigint_handler(signum, frame, my_argument):
...    print(my_argument) # or do something useful
... 
>>> signal.signal(signal.SIGINT, partial(sigint_handler, my_argument="foobar"))

使用上述技术解决原始问题:

>>> class MyObject:
...     def terminate (self):
...         do_something()
... 
>>> def sigint_handler(signum, frame, obj):
...   obj.terminate()
... 
>>> signal.signal(signal.SIGINT, partial(sigint_handler, obj=MyObject()))

将在MyObject上致电.terminate()的{​​{1}} {/ 1}}。