Manuelles Unterbrechen der Anweisungsausführung im Python-Fenster von ArcMap


20

Wie unterbricht man die Ausführung eines lang laufenden Prozesses in der Python-Konsole von ArcMap?

Wie unterbricht man beispielsweise eine lange Iteration wie die folgende, wenn sie einmal gestartet wurde?

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

Ich möchte den Vorgang jederzeit abbrechen, indem ich eine Tastenkombination drücke, auf eine Schaltfläche oder Ähnliches klicke, während der im Konsolenfenster eingegebene Code ausgeführt wird .


1
Mit Pause meinen Sie, zwingen Sie es zu beenden?
RK

@RK: Ja, ich möchte das Beenden jederzeit erzwingen, da ich (1) eine unerwünschte Ausgabe gesehen habe, (2) die falsche Verarbeitungsreihenfolge eingegeben habe, (3) einen anderen Grund.
Alex Essilfie

2
Habe gerade die möglichen Tastaturkürzel überprüft. Strg + Z, Strg + C und ESC funktionieren nicht. Möglicherweise müssen Sie IDLE oder eine andere IDE verwenden, um die gewünschten Ergebnisse zu erzielen.
RK

Verwenden Sie Strg + Z in LX-Terminal für Windows-Maschine

@anurag: Danke für deinen Vorschlag, aber das wünsche ich mir nicht. Ich möchte, dass die Ausführung im Python-Fenster in ArcMap gestoppt wird, ohne eine IDE oder ein Terminal zu verwenden. Ich weiß bereits, wie man die Ausführung in einem Terminal oder einer IDE beendet.
Alex Essilfie

Antworten:


14

Einfach getestet und ESC funktioniert auch nicht. ArcGIS friert nur für einen Moment ein und fährt dann fort. Es scheint keine Möglichkeit zu geben, das Beenden zu erzwingen, sobald es in der ArcGIS Python-Konsole ausgeführt wird. Sie können es auch nicht mit dem Task-Manager beenden, da der Python-Prozess dort nicht angezeigt wird.

Wenn Sie das Beenden wirklich erzwingen möchten, sollten Sie eine IDE wie IDLE verwenden, anstatt dies in der ArcGIS Python-Konsole zu tun. In IDLE können Sie zum Beispiel Ctrl+ Zoder Ctrl+ verwenden, Cum die Ausführung zu beenden.


1
Im ArcGIS Pro-Python-Fenster können Sie Python-Code stoppen, während er ausgeführt wird, da das ArcGIS 10.X-Fenster technologische Einschränkungen aufweist.
Jason Scheirer

9

Dies ist die Methode, die ich benutze:

  • Erstellen Sie ein kleines Python-Skript namens kill_processx.py
  • Wenn kill_processx ausgeführt wird, wird eine kleine Testdatei mit dem Namen stop_processx.txt erstellt.
  • Überprüfen Sie oben oder unten in der Schleife im Hauptprogramm, ob die Datei stop_processx.txt vorhanden ist.
  • Wenn dies der Fall ist, führen Sie die erforderlichen Bereinigungsroutinen aus und halten Sie dann ordnungsgemäß an.
  • Löschen Sie die Datei stop_processx.txt

Beispiel für eine kill_processx.py-Datei:

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()

Was ist das Skript, das Sie "kill_processx.py" nennen?
Aaron

1
Das Skript kill_process erstellt nur eine leere txt-Datei mit dem richtigen Namen im richtigen Ordner.
mhoran_psprep

Könnten Sie bitte ein Beispielskript in Ihren Beitrag aufnehmen, damit wir eine bessere Vorstellung davon bekommen, wie dies bei der Frage des OP helfen könnte?
Aaron

@mhoran_psprep: Ich habe die Antwort von RK akzeptiert , weil sie die Frage beantwortet (dies ist nur in einer IDE möglich). +1 für Ihre Problemumgehung. Ich denke, ich werde es in Zukunft implementieren.
Alex Essilfie

4

Es ist eine schlechte Praxis, das Herunterfahren mit Brute-Force-Taktiken zu erzwingen. Vielmehr sollten Sie, wie @Aragon betont hat, Ihrem Skript eine Fehlerbehandlung hinzufügen, um Komponenten zu isolieren und / oder das Skript anzuhalten, wenn bestimmte Bedingungen nicht erfüllt sind. Wie @RK hervorhebt, ist die ArcGIS-Python-Konsole für das Ausführen komplexer Skripte nahezu wertlos und sollte in der Praxis für einfache Vorgänge reserviert sein - bleiben Sie bei IDLE , Pythonwin , Pyscripter oder einem der Hosts anderer IDEs. Hier sind Diskussionen zu Ihrer Frage:

Wie verwende ich sys.exit (0) in einem Arcpy-Skript, um vorzeitig zu beenden, ohne dass eine Fehlermeldung angezeigt wird?

Beenden eines Python-Skripts

Wie stoppe ich einen Befehl oder eine Eingabeaufforderung in Python?


1
Und natürlich können Sie mit einer IDE wie PyScripter einfach einen "Haltepunkt" in Ihre "for ... range" -Anweisung einfügen, das Skript im "Debug-Modus" ausführen und die IDE wird automatisch "pausieren" Zeigen Sie während des iterativen Vorgangs auf und lassen Sie sich die bereits verarbeiteten Ergebnisse anzeigen.
RyanDalton

2

Ich arbeite in 10.4 und habe festgestellt, dass ich auf das Schließen-X klicken kann, Bildbeschreibung hier eingebenwährend ein Skript ausgeführt wird. ArcMap fragt mich, ob ich einen Vorgang abbrechen möchte.

Bildbeschreibung hier eingeben

Ich klicke auf Ja. ArcMap fragt mich dann, ob ich vor dem Beenden speichern möchte. Ich klicke auf Abbrechen. Das Skript löst eine Tastaturunterbrechung aus.


Auf welche Schaltfläche zum Schließen klicken Sie, um diese Aktionssequenz auszulösen?
Alex Essilfie

Das rote X oben rechts in den meisten (allen?) Windows-Programmen. Siehe das kleine Bild in meiner Antwort.
Emil Brundage

1

Wenn Sie auf pythonische Weise lösen möchten, versuchen Sie Folgendes:

import sys
sys.exit()

oder benutze:

raise SystemExit()

im Detail:

import time
import sys

sTime= time.time()

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

ich hoffe es hilft dir ...


Nein, das ist nicht was ich will. Ich möchte den Vorgang jederzeit abbrechen, indem ich eine Tastenkombination drücke, auf eine Schaltfläche oder Ähnliches klicke, während der im Konsolenfenster eingegebene Code ausgeführt wird . Mir ist bewusst sys.exit(), dass dies jedoch nicht funktioniert, wenn eine Schleife oder ein ähnlich langer Prozess ausgeführt wird.
Alex Essilfie

@ Upvoters: das ist nicht die Antwort, die ich suche. Es beantwortet meine Frage nicht . Ich möchte die Ausführung einer Anweisung (normalerweise Iteration) unterbrechen, indem ich eine Tastenkombination drücke oder auf eine Schaltfläche oder ähnliches klicke.
Alex Essilfie

1

Zumindest in ArcMap 10.4 können Sie dies tun. Stellen Sie sicher, dass das Fenster "Ergebnisse" sichtbar ist. (Wenn nicht, finden Sie es unter "Geoverarbeitung"). Wenn Sie jetzt einen Befehl ausführen, wird dieser in diesem Fenster angezeigt. Klicken Sie mit der rechten Maustaste darauf und drücken Sie "Abbrechen".



0

Mit IDLE habe ich eine Datei namens "stop.py", die die einzelne Zeile enthält: "pass". Lassen Sie diese Datei in IDLE geöffnet, während ein anderes .py-Skript ausgeführt wird. Durch Klicken auf F5 im Fenster "stop.py" wird der LEERLAUF zurückgesetzt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.