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

3

我知道如何在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个回答

3

我不确定为什么您在问题中添加了以下部分:

当我尝试向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()))

在按下^C时,会调用MyObject实例的.terminate()方法。


谢谢,我试了一下带有“partial”的版本,效果非常好。 - Marek Teuchner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接