Question

J'ai une fonction qui est responsable de tuer un processus enfant lorsque le programme se termine:

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 les modules os et signal se vide avant de procéder atexit est appelé. les réimporter résout le problème, mais ce comportement me semble bizarre - ces modules sont importés avant enregistrer mon gestionnaire, alors pourquoi sont-ils déchargés avant mon propre gestionnaire de sortie fonctionne

Était-ce utile?

La solution

Il n'y a pas de fortes garanties sur l'ordre dans lequel les choses sont détruites au moment de la fin du programme, il est donc préférable d'assurer les fonctions enregistrées atexit-sont autonomes. 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)

Il est préférable de 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).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top