我知道如何在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
添加另一个参数时,我收到错误。
答案 0 :(得分:2)
我不确定你为什么要添加这部分
当我尝试向sigint_handler添加另一个参数时,我收到错误。
你的问题,但我首先要说明的是:
使用wrapper
或partial
(这是一个包装工厂),如下所示:
>>> 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}}。