boucle asyncio add_signal_handler () dans Windows

Je porte actuellement un projet Python de Linux vers Windows (en utilisant Anaconda Python 3.6). Tout fonctionne parfaitement, je ne peux pas obtenir une sortie élégante de la boucle asynchrone.

Sous Linux, je fais ce qui suit:

class GracefulExit(SystemExit): code = 1 def raise_graceful_exit(): raise GracefulExit() loop = asyncio.get_event_loop() loop.add_signal_handler(signal.SIGINT, raise_graceful_exit) loop.add_signal_handler(signal.SIGTERM, raise_graceful_exit) try: loop.run_forever() except GracefulExit: pass shutdown() 

Sous Windows, malheureusement, je reçois une NotImplementedError sur add_signal_handler . Sans cela, bien sûr, je n’ai jamais une chance pour un arrêt propre du programme.

Des idées sur la façon de résoudre ce problème? Merci.

Windows n’a pas de signaux.

Si le processus est détruit via l’API TerminateProcess, vous n’avez aucune chance de le nettoyer (c’est comme ‘kill -9’, élimine votre processus).

Mais Windows a deux façons de signaler si votre code doit sortir, un pour les programmes de console (par exemple, python.exe) et un pour les programmes d’interface graphique (pythonw.exe).

Python gère automatiquement la console et déclenche une exception KeyboardInterrupt, mais vous pouvez associer votre propre code à ce gestionnaire avec les API du gestionnaire de contrôle de la console ( https://docs.microsoft.com/en-us/windows/console/console-control -handlers ), mais c’est probablement excessif. Définissez simplement un gestionnaire d’exceptions approprié sur votre boucle d’événements.

Pour les processus GUI, Windows vous envoie des messages Windows, comme WM_QUIT ou d’autres si un utilisateur ferme une session, le système passe en mode d’économie d’énergie, etc., vous pouvez également les gérer avec l’aide de ctypes ou du package win32. beaucoup de librairies de python.