2010-08-10 6 views
3

J'ai mon code et ça va à l'infini. Ce que je veux, c'est que si dans la fenêtre de commande unix si l'utilisateur entre un ctrl C, je veux que le programme termine la boucle en cours et sorte de la boucle. Donc je veux que ça casse, mais je veux que ça finisse la boucle actuelle. Est-ce que ctrl C est utilisé? Devrais-je regarder une autre entrée?Infinity Loop et la saisie de l'utilisateur comme terminaison

Répondre

3

Pour faire cela correctement et exactement comme vous le voulez, c'est un peu compliqué.

Fondamentalement, vous voulez piéger le Ctrl-C, configurer un drapeau, et continuer jusqu'au début de la boucle (ou la fin) où vous vérifiez ce drapeau. Cela peut être fait en utilisant le module signal. Heureusement, quelqu'un a déjà fait cela et vous pouvez utiliser le code dans l'exemple linked.

Modifier: Sur la base de votre commentaire ci-dessous, une utilisation typique de la classe BreakHandler est:

ih = BreakHandler() 
ih.enable() 
for x in big_set: 
    complex_operation_1() 
    complex_operation_2() 
    complex_operation_3() 
    # Check whether there was a break. 
    if ih.trapped: 
     # Stop the loop. 
     break 
ih.disable() 
# Back to usual operation 
+0

pour x dans big_set: complex_operation_1() complex_operation_2() complex_operation_3() # Vérifiez si il y avait une pause. si ih.trapped: # Arrête la boucle. pause ih.disable() # Retour à l'opération habituelle ... donc pour cette partie la seule chose que je devrais faire pour le lancer est si ih.trapped: # Arrêtez la boucle. break ih.disable() à la fin de mon code alors? – Yuki

+0

@Yuki: ajouter du code aux commentaires perd son formatage qui gâche le code Python, mais il semble que vous ayez largement raison. Vous devez faire 'bh = BreakHandler(); bh.enable() 'avant la boucle, bien sûr. –

+0

J'ai ceci: (Je ne sais pas pour le moment comment transformer le code ici en plus agréable le format) ih = BreakHandler() ih.enable() while (true): * Faites tout * si ih.trapped: break ih.disable() – Yuki