Comment interrompre manuellement l'exécution des instructions dans la fenêtre Python d'ArcMap?

20

Comment interrompre l'exécution d'un processus de longue durée dans la console python d'ArcMap?

Par exemple, comment interrompez-vous une longue itération comme celle ci-dessous une fois qu'elle est lancée?

for i in range(1, 50):
  # some long process which takes over a minute to complete

Je veux arrêter le processus à tout moment en appuyant sur une combinaison de touches, en cliquant sur un bouton ou quelque chose de similaire pendant que le code que j'ai entré dans la fenêtre de la console est en cours d'exécution .

Alex Essilfie
la source
1
Par pause, voulez-vous dire le forcer à quitter?
RK
@RK: Oui, je veux le forcer à quitter à tout moment, car j'ai (1) vu une sortie indésirable, (2) j'ai entré le mauvais ordre de traitement, (3) toute autre raison.
Alex Essilfie
2
Je viens de vérifier les raccourcis clavier possibles. Ctrl + Z, Ctrl + C et ESC ne fonctionnent pas tous. Vous devrez peut-être utiliser IDLE ou un autre IDE pour accomplir ce que vous voulez.
RK
utiliser ctrl + Z dans le terminal lx pour la machine Windows
@anurag: Merci pour votre suggestion mais ce n'est pas ce que je désire. Ce que je veux, c'est arrêter l'exécution à l'intérieur de la fenêtre Python dans ArcMap, sans utiliser d'IDE ou de terminal. Je sais déjà comment terminer l'exécution dans un terminal ou un IDE.
Alex Essilfie

Réponses:

14

Je viens de le tester et ESC ça ne marche pas non plus. ArcGIS se fige juste un instant, puis continue. Il ne semble pas y avoir de moyen de forcer sa fermeture une fois qu'il s'exécute dans la console ArcGIS Python. Vous ne pouvez pas non plus le tuer à l'aide du Gestionnaire des tâches car le processus Python n'apparaît pas là-bas.

Si vous voulez vraiment pouvoir le forcer à le quitter, vous pouvez envisager d'utiliser un IDE comme IDLE plutôt que de le faire dans la console ArcGIS Python. Dans IDLE par exemple, vous pouvez utiliser Ctrl+ Zou Ctrl+ Cpour terminer l'exécution.

RK
la source
1
La fenêtre ArcGIS Pro Python vous permet d'arrêter le code Python pendant son exécution, en raison des limitations technologiques que la fenêtre ArcGIS 10.X ne peut pas.
Jason Scheirer
9

Voici la méthode que j'utilise:

  • créer un petit script python appelé kill_processx.py
  • Lorsqu'il est exécuté, kill_processx crée un petit fichier de test appelé stop_processx.txt.
  • En haut ou en bas de la boucle dans le programme principal, vérifiez si le stop_processx.txt existe.
  • S'il existe, exécutez toutes les routines de nettoyage dont vous avez besoin, puis arrêtez-vous correctement.
  • Supprimez le fichier stop_processx.txt

exemple d'un fichier kill_processx.py:

import os 
nameof_killfile="stop_processx.txt"

if os.path.exists(nameof_killfile): 
    os.remove(nameof_killfile) 
else:
    killit=open(nameof_killfile,"w") 
    killit.close()
mhoran_psprep
la source
Quel est le script que vous appelez "kill_processx.py"?
Aaron
1
le script kill_process crée juste un fichier txt vide avec le nom correct dans le bon dossier.
mhoran_psprep
Pourriez-vous s'il vous plaît inclure un exemple de script dans votre message, afin que nous puissions avoir une meilleure idée de la façon dont cela pourrait aider avec la question du PO?
Aaron
@mhoran_psprep: J'ai accepté la réponse de RK car elle répond à la question (ce n'est possible que dans un IDE). +1 pour votre solution de contournement. Je suppose que je vais l'implémenter à l'avenir.
Alex Essilfie
4

C'est une mauvaise pratique de forcer l'arrêt à l'aide de tactiques de force brute. Au lieu de cela, comme l'a souligné @Aragon, vous devez ajouter la gestion des erreurs à votre script pour isoler les composants et / ou arrêter le script si certaines conditions ne sont pas remplies. Comme le souligne @RK, la console ArcGIS python est pratiquement sans valeur pour l'exécution de scripts complexes et, en pratique, devrait être réservée à des opérations simples - restez avec IDLE , pythonwin , pyscripter ou n'importe quel hôte d'autres IDE. Voici les discussions liées à votre question:

Comment utiliser sys.exit (0) dans un script arcpy pour quitter tôt sans qu'un message d'erreur ne s'affiche?

Mettre fin à un script Python

Comment arrêter une commande ou une invite en Python?

Aaron
la source
1
Et bien sûr, avec un IDE comme PyScripter, vous pouvez simplement ajouter un "point d'arrêt" à votre instruction "for ... range", exécuter le script en "mode débogage", et l'EDI "suspendra" automatiquement en même temps pendant le processus itératif et vous permettent d'inspecter les résultats qui ont déjà été traités.
RyanKDalton-OffTheGridMaps
2

Je travaille dans 10.4 et j'ai découvert que je pouvais cliquer sur le X fermé entrez la description de l'image icipendant l'exécution d'un script. ArcMap me demandera si je souhaite annuler une opération.

entrez la description de l'image ici

Je clique sur Oui. ArcMap me demande ensuite si je souhaite enregistrer avant de quitter. Je clique sur Annuler. Le script déclenche une interruption du clavier.

Emil Brundage
la source
Sur quel bouton de fermeture cliquez-vous pour déclencher cette séquence d'actions?
Alex Essilfie
Les fenêtres X rouges dans le coin supérieur droit de la plupart (tous?) Des logiciels Windows. Voir la petite photo dans ma réponse.
Emil Brundage
1

si vous voulez résoudre de manière pythonique, essayez ceci:

import sys
sys.exit()

Ou utiliser:

raise SystemExit()

en détail:

import time
import sys

sTime= time.time()

if time.time() - sTime > 60:
   sys.exit()

J'espère que ça t'aide...

Aragon
la source
Non, ce n'est pas ce que je veux. Je veux arrêter le processus à tout moment en appuyant sur une combinaison de touches, en cliquant sur un bouton ou quelque chose de similaire pendant que le code que j'ai entré dans la fenêtre de la console est en cours d'exécution . Je suis au courant, sys.exit()mais cela ne fonctionne pas lorsqu'une boucle ou un processus similaire est en cours d'exécution.
Alex Essilfie
@Upvoters: ce n'est pas la réponse que je cherche. Cela ne répond pas à ma question . Je souhaite interrompre l'exécution d'une instruction (généralement une itération) en appuyant sur une combinaison de touches ou en cliquant sur un bouton ou quelque chose de similaire.
Alex Essilfie
1

Au moins dans ArcMap 10.4, vous pouvez le faire. Assurez-vous que la fenêtre "Résultats" est visible. (Sinon, trouvez-le sous "Géotraitement"). Maintenant, si vous avez une commande en cours d'exécution, elle apparaîtra dans cette fenêtre. Faites un clic droit dessus et appuyez sur "Annuler".

H.Durham
la source
0

En utilisant IDLE, j'ai un fichier appelé "stop.py" qui contient la seule ligne: "pass". Gardez ce fichier ouvert dans IDLE pendant qu'un autre script .py est en cours d'exécution. Cliquer sur F5 dans la fenêtre "stop.py" réinitialise IDLE.

nbcaldon
la source