WOPR> Global Thermonuclear War
Par hr le jeudi 3 janvier 2008, 18:33 - code - Lien permanent
Dans mon parcours d'initiation à python, je me suis retrouvé face à un problème existentiel (ce qui donne tout le caractère initiatique au parcours, le problème, parce qu'il est existentiel ... laisse tomber). Lors de l'utilisation du module cmd, comment gérer correctement les interruptions classiques que sont ctrl+D (EOF) et ctrl-C (SIGINT).
Ci-après, un squelette pour la gestion des 2 signaux évoqués. Juste après ci-après, les quelques explications qui s'imposent.
import sys
import cmd
class shell(cmd.Cmd):
def __init__(self):
cmd.Cmd.__init__(self)
# Let's handle ctrl+D signals and quit gently
def do_EOF(self, str):
# CLEAN HERE
return 1
if __name__ == "__main__":
console = shell()
try:
console.cmdloop()
except KeyboardInterrupt:
# CLEAN HERE
sys.exit(0)
ctrl-D ou la fin du monde
Le manuel de cmd nous dit :
An end-of-file on input is passed back as the string 'EOF'.
Ce qui signifie que la combinaison de touches ctrl+D revient à gérer la commande EOF, la méthode appelée est donc do_EOF().
Une autre information à propos de cmdloop() donnée dans le manuel est :
This method will return when the postcmd() method returns a true value. The stop argument to postcmd() is the return value from the command's corresponding do_*() method.
Donc si la méthode do_EOF() retourne simplement 1, la boucle va tout bêtement s'arrêter.
ctrl-C ou la fin de l'univers
En Python, l'utilisation de ctrl-C lève l'exception KeyboardInterrupt, en capturant cette interruption, on permet au script de sortir de façon maitrisée.
Evolution
Il est conseillé d'ajouter des actions de nettoyage au niveau des commentaires # CLEAN HERE pour permettre une sortie de la console vraiment sans encombre. Il reste encore à trouver un moyen élégant d'utiliser ctrl-c pour annuler la ligne en cours et récupérer l'invite vierge sans quitter cmd.cmdloop()
Attention toutefois, ce code n'a pas été testé dans un environnement microsoft. Les signaux ne sont surement pas traités de la même façon, ça n'étonnera personne.