web-dev-qa-db-fra.com

Fin d'une boucle while infinie

J'ai actuellement du code qui exécute essentiellement une boucle while infinie pour collecter des données auprès des utilisateurs. Mise à jour constante des dictionnaires/listes en fonction du contenu d'un fichier texte. Pour référence:

while (True):
    IDs2=UpdatePoints(value,IDs2)
    time.sleep(10)

Fondamentalement, mon problème est que je ne sais pas quand je veux que cela se termine, mais après cela, la boucle while s'exécute, je veux utiliser les informations collectées, ne pas les perdre en plantant mon programme. Existe-t-il un moyen simple et élégant de simplement sortir de la boucle while quand je veux? Quelque chose comme appuyer sur une certaine touche de mon clavier serait génial.

29
Blessoul

Vous pouvez essayer d'encapsuler ce code dans un bloc try/except, car les interruptions clavier ne sont que des exceptions:

try:
    while True:
        IDs2=UpdatePoints(value,IDs2)
        time.sleep(10)
except KeyboardInterrupt:
    print('interrupted!')

Ensuite, vous pouvez quitter la boucle avec CTRL-C.

69
Steve Howard

Vous pouvez utiliser des exceptions. Mais vous ne devez utiliser des exceptions que pour des choses qui ne devraient pas se produire. Donc pas pour ça.

C'est pourquoi je recommande des signaux:

import sys, signal
def signal_handler(signal, frame):
    print("\nprogram exiting gracefully")
    sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)

vous devez mettre cela au début de votre programme et lorsque vous appuyez sur ctrl + c où que ce soit dans votre programme, il s'arrêtera gracieusement

Explication du code:

Vous importez sys et signals. Ensuite, vous créez une fonction qui s'exécute à la sortie. sys.exit(0) arrête la programmation avec le code de sortie 0 (le code qui dit, tout s'est bien passé).

Lorsque le programme obtient le SIGINT soit par ctrl-c soit par une commande kill dans le terminal, vous programmez s'arrêtera normalement.

15
Tristan

Je pense que la solution la plus simple serait d'attraper le KeyboardInterrupt lorsque le touche d'interruption est enfoncée , et l'utiliser pour déterminer quand arrêter la boucle.

except KeyboardInterrupt:
    break

L'inconvénient de rechercher cette exception est qu'elle peut empêcher l'utilisateur de terminer le programme pendant que la boucle est en cours d'exécution.

4
eandersson

J'utilise python pour suivre les cours des actions et soumettre des commandes d'achat/vente automatisées sur mon portefeuille. Pour faire court, je voulais que mon programme de suivi envoie une requête ping au serveur de données pour obtenir des informations et place les transactions hors de la informations recueillies, mais je voulais également enregistrer les données de stock pour référence future, en plus de pouvoir démarrer/arrêter le programme quand je le voulais.

Ce qui a fini par fonctionner pour moi était le suivant:

trigger = True
while trigger == True:
 try:
  (tracking program and purchasing program conditions here)
 except:
  trigger = False

print('shutdown initialized')
df = pd.DataFrame...
save all the datas
print('shutdown complete')

etc.

À partir de là, alors que le programme est dans la boucle pour toujours en train de spammer les demandes de données de l'API de mon courtier, en utilisant le CTRL-C la fonction d'interruption du clavier bascule l'exception sur la boucle try, ce qui annule la boucle while, permettant au script de finaliser le protocole d'enregistrement des données sans interrompre brutalement le script entier.

J'espère que cela t'aides!

résultant

1
Michael Green