2010-04-03 23 views
2

其他模塊我有一個功能,它負責在程序結束時殺死一個子進程:引用在atexit對

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被調用之前被卸載。重新導入它們可以解決問題,但是這種行爲對我來說似乎很奇怪 - 在我註冊我的處理程序之前導入了這些模塊,爲什麼在我自己的退出處理程序運行之前它們被卸載?

回答

6

對於在程序終止時被銷燬的順序沒有強有力的保證,所以最好確保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較小)。