2010-04-03 3 views
2

j'ai une fonction qui est responsable de la mort d'un processus fils se termine le programme:référençant d'autres modules dans atexit

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

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

Cependant je reçois un message d'erreur lorsque cette fonction est appelée:

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' 

On dirait que les modules os et signal sont déchargés avant l'appel de atexit. Leur réimportation résout le problème, mais ce comportement me semble étrange - ces modules sont importés avant d'enregistrer mon gestionnaire, alors pourquoi sont-ils déchargés avant que mon propre gestionnaire de sortie ne fonctionne?

Répondre

6

Il n'y a pas de garantie absolue quant à l'ordre dans lequel les choses sont détruites au moment de la fin du programme. Il est donc préférable de vous assurer que les fonctions enregistrées sont indépendantes de atexit. Par exemple, dans votre cas:

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) 

Ceci est préférable à la réimportation des modules (qui pourrait éventuellement entraîner le ralentissement de la fin du programme et même des boucles sans fin, mais ce risque est moindre pour les modules « fournis par le système », comme os).

Questions connexes