Python >> Tutoriel Python >  >> Python

Comment arrêter un script Python (clavier et programmation)

Pourquoi arrêter un script Python ?

En tant que langage de programmation, Python est conçu pour lire le code ligne par ligne et s'arrêter à la fin du script par défaut - alors pourquoi aurions-nous besoin de l'arrêter ?

Bien qu'il existe un certain nombre de raisons pour lesquelles cela peut être nécessaire, elles se répartissent essentiellement en deux catégories distinctes :

  1. Vous avez fait une erreur avec votre code, par exemple le programme continue de s'exécuter dans une boucle infinie, ou du moins très longue (toute personne ayant utilisé Python peut probablement comprendre cela !)
  2. Le code lui-même est correct, mais vous souhaitez arrêter l'exécution de votre script si certaines conditions sont remplies ou non.

L'option 2 peut être planifiée en incluant un mécanisme d'arrêt dans notre code, c'est-à-dire par programmation. Pour l'option 1, nous devons comprendre comment arrêter notre code arbitrairement lorsque le programme est en cours d'exécution, et nous le faisons en utilisant notre clavier. Examinons ces deux options plus en détail.

Arrêts du clavier

Le mécanisme exact d'un arrêt du clavier dépendra vraiment de votre système d'exploitation, pour les besoins de cet article, nous allons utiliser une machine Windows 10, donc toute la syntaxe sera liée à cet environnement.

Pour commencer, créons un petit script qui nous donnera le problème que nous cherchons à résoudre, et appelons-le test.py et enregistrez-le dans un répertoire de travail C:\Users\Rikesh :

x = 1
while x >= 1:
    print (x)
    x = x +1 

Si nous exécutons maintenant le script ci-dessus via notre interpréteur Python, il continuera à imprimer des nombres séquentiellement indéfiniment. Nous n'avons mis aucune condition pour qu'il s'arrête.

C:\Users\Rikesh> test.py
1
2
3
4
..

Interruption clavier

L'une des méthodes les plus courantes pour arrêter un script consiste à utiliser le raccourci clavier suivant, appelé KeyboardInterrupt :

Ctrl + C

Lorsque nous l'utilisons, nous obtenons une réponse de notre interpréteur Python nous indiquant que le programme a été arrêté à l'aide de ce raccourci.

..
    2396
    2397
2398
Traceback(most recent call last):
      File “C:Users\Rikesh ..   “
KeyboardInterrupt

2.2 Ctrl + Pause / Pause

Bien que ce qui précède fonctionne bien avec notre exemple de code simple, il peut arriver que ce ne soit pas le cas. Par exemple, notre script pourrait explicitement empêcher cela de fonctionner en excluant spécifiquement KeyboardInterrupt, c'est-à-dire à l'exception de KeyboardInterrupt, ou il peut même être exclu avec la syntaxe except normale. Par exemple :

x = 1
while x >= 1:
    try: 
        print (x)
        x = x +1 
    except:
pass 

L'effet de except:, dans cet exemple, est d'annuler notre raccourci KeyboardInterrupt - que ce soit intentionnellement ou non. Alors maintenant, lorsque nous exécutons le script ci-dessus via notre invite de commande Windows, notre raccourci ctrl + c est inefficace et les chiffres continuent à s'imprimer.

C:\Users\Rikesh> test.py
1
2
3
4
5
6
..

Dans ce cas, nous pouvons utiliser Ctrl + Pause/Break qui est un moyen beaucoup plus puissant d'arrêter notre script.

..
    2396
    2397
    ˄c
    C:\Users\Rikesh>

Non seulement cela arrête le script, mais comme ce n'est pas le KeyboardInterrupt raccourci, nous ne recevons pas le même message de notre interprète. Nous sommes simplement renvoyés à l'invite de commande.

Arrêts programmés

Nous avons donc vu comment utiliser notre clavier pour arrêter l'exécution de nos scripts, voyons maintenant comment nous pouvons utiliser notre code pour arrêter les scripts. Cela nous obligera évidemment à comprendre notre code et à déterminer à l'avance où des arrêts seront nécessaires.

Par programmation dans le code de développement

Lorsque vous démarrez Python, le module de site est automatiquement chargé, et cela vient avec les objets quit() et exit() par défaut. Ces deux objets fonctionnent de la même manière, comme suit, et comme leurs noms l'indiquent peuvent être utilisés pour arrêter nos scripts :

x = 1
while x >= 1:
    print (x)
    x = x +1
    if x >= 5:
        quit()
x = 1
while x >= 1:
    print (x)
    x = x +1
    if x >= 5:
        exit()

Dans les deux cas, si nous exécutons le code ci-dessus à partir de notre interpréteur, le programme s'arrêtera et quittera automatiquement une fois que x aura atteint 5.

C:\Users\Rikesh> test.py
1
2
3
4
C:\Users\Rikesh>

Cependant, veuillez noter à la fois quit() et exit() sont uniquement conçus pour être utilisés dans l'interpréteur Python, où le module de site a été chargé. Aucun de ceux-ci n'est jugé approprié pour une utilisation dans le code de production, c'est-à-dire dans une situation réelle, car nous ne contrôlons pas comment et si le module de site est chargé. Pour cette raison, ces deux options ne doivent être utilisées qu'à des fins de développement et dans l'interpréteur Python.

Par programmation dans le code de production

Voyons maintenant comment nous pouvons empêcher nos scripts de s'exécuter dans le code de production. Pour clarifier, nous entendons par là le code prêt à être envoyé au client / utilisateur final. Il a été débogué, et est bien structuré et bien documenté.

Utiliser sys.exit()

C'est le moyen le plus courant d'arrêter nos scripts par programme, et il le fait en levant/en levant une exception SystemExit. Si l'exception n'est pas interceptée, l'interpréteur Python est fermé et le programme s'arrête. Comme nous devons importer explicitement le module sys, nous intégrons sys à notre script, garantissant ainsi qu'il sera toujours là lorsque le code sera exécuté. Cela rend cette méthode idéale pour une utilisation dans notre code de production :

import sys

x = 1
while x >= 1:
    print (x)
    x = x +1
    if x >= 5:
        sys.exit()

Maintenant, en exécutant le script, nous obtenons la sortie suivante :

C:\Users\Rikesh> test.py
1
2
3
4
C:\Users\Rikesh>

Alors que le résultat final est le même qu'avant, avec quit() et exit() , cette méthode est considérée comme une bonne pratique et un bon codage. Comme nous avons importé le module sys dans notre script, il sera toujours disponible lors de l'exécution du script..

lever SystemExit

C'est intéressant car, alors qu'il fait tout ce que sys.exit() fait, il ne semble pas être couramment utilisé ou considéré comme une pratique exemplaire. Cela a l'avantage de ne nécessiter aucune importation et tous les sys.exit() opération fait, comme nous l'avons vu dans la section précédente, est de lever un SystemExit exception quand même. Par conséquent, il existe un argument selon lequel, en utilisant cette méthode, nous rendons notre code plus propre et plus efficace :

x = 1
while x >= 1:
    print (x)
    x = x +1
    if x >= 5:
        raise SystemExit 

Et lorsque nous exécutons le code, le résultat est le suivant :

C:\Users\Rikesh> test.py
1
2
3
4
C:\Users\Rikesh>

Utiliser os._exit()

La dernière méthode que nous examinerons est os._exit() qui fait partie du Python os module fournissant des fonctions pour interagir directement avec le système d'exploitation. Cette méthode appelle essentiellement l'arrêt immédiat du programme, plutôt que de lever une exception, c'est peut-être la plus extrême de toutes celles que nous avons vues.

L'utilisation pratique est donc limitée à des cas très spécifiques, donc pour les besoins de cet article, nous nous concentrerons sur comment l'utiliser plutôt que pourquoi et quand. Tout d'abord, nous devons importer le os module pour que cela fonctionne, et contrairement aux autres méthodes que nous avons vues, nous ne pouvons pas passer un paramètre vide. Cela signifie que nous devons spécifier le statut de sortie en cours, qui est normalement une valeur entière, 0 étant une sortie normale. Si nous supposons que c'est le cas, notre code ressemblera à ceci :

import os 
x = 1
while x >= 1:
    print (x)
    x = x +1
    if x >= 5:
        os._exit(0)

Et lorsque nous exécutons le code, le résultat est le suivant :

C:\Users\Rikesh> test.py
1
2
3
4
C:\Users\Rikesh>

Résumé

Nous avons vu un certain nombre de méthodes pour arrêter nos scripts Python, ce qui ne devrait pas surprendre quiconque connaît Python. Bien qu'ils fournissent tous le même résultat final, ils ont des applications différentes, en particulier entre l'utilisation de votre clavier ou l'arrêt par programme avec votre code.

Même au sein des différents « arrêts » programmatiques, la méthode la plus appropriée dépendra vraiment du fait que vous écriviez du code à des fins de développement ou de production. Alors que l'utilisation pratique de os._exit() est limité, sys.exit() est certainement considéré comme la meilleure pratique avec le code de production. À mon avis, cependant, il existe de solides arguments en faveur de l'utilisation du raise SystemExit approcher. Elle semble la plus propre et la plus logique de toutes les méthodes, et dépend moins des bibliothèques externes - tous les mêmes attributs qui font de Python un langage si polyvalent.