【问题标题】:Referencing other modules in atexit在 atexit 中引用其他模块
【发布时间】:2010-04-03 18:11:48
【问题描述】:

我有一个函数负责在程序结束时杀死一个子进程:

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'

看起来os 和signal 模块在调用atexit 之前已被卸载。重新导入它们可以解决问题,但这种行为对我来说似乎很奇怪 - 这些模块是在我注册我的处理程序之前导入的,那么为什么在我自己的退出处理程序运行之前将它们卸载?

【问题讨论】:

    标签: python atexit


    【解决方案1】:

    对于程序终止时销毁事物的顺序没有强有力的保证,因此最好确保atexit-registered 函数是自包含的。例如,在您的情况下:

    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,这种风险较小)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      • 2020-07-09
      • 1970-01-01
      • 2017-07-24
      • 2015-09-08
      • 2020-06-13
      • 1970-01-01
      相关资源
      最近更新 更多