我有一个功能,是负责杀死子进程在程序结束时:

class MySingleton:
    def __init__(self):
        import atexit
        atexit.register(self.stop)

    def stop(self):
        os.kill(self.sel_server_pid, signal.SIGTERM)

但是我得到时调用该函数的错误消息:

Traceback (most recent call last):
File "/usr/lib/python2.5/atexit.py", line 24, in _run_exitfuncs
   func(*targs, **kargs)
File "/home/commando/Development/Diploma/streaminatr/stream/selenium_tests.py", line 66, in stop
   os.kill(self.sel_server_pid, signal.SIGTERM)
AttributeError: 'NoneType' object has no attribute 'kill'

ossignal模块外貌atexit被调用之前得到卸载。重新导入他们解决了这个问题,但这种行为似乎怪我? - 前注册我处理这些模块都是进口的,那么,为什么他们自己退出处理程序运行之前卸载

有帮助吗?

解决方案

有关于该事情在程序终止时破坏了秩序没有很强的保障,所以最好以确保atexit注册功能是自包含的。例如,你的情况:

class MySingleton:
    def __init__(self):
        import atexit
        atexit.register(self.stop)
        self._dokill = os.kill
        self._thesig = signal.SIGTERM

    def stop(self):
        self._dokill(self.sel_server_pid, self._thesig)

这是优选重新导入模块(其可以想见,原因程序终止的减速,甚至无休止的循环,尽管这种风险为“系统提供的”模块,诸如os较小)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top