Jak ręcznie przerwać wykonywanie instrukcji w oknie Python ArcMap?

20

Jak można przerwać wykonywanie długotrwałego procesu w konsoli Pythona ArcMap?

Na przykład, jak przerwać długą iterację, taką jak poniżej, po jej uruchomieniu?

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

Chcę zatrzymać proces w dowolnym momencie, naciskając kombinację klawiszy, klikając przycisk lub coś podobnego, gdy kod, który wprowadziłem w oknie konsoli, jest uruchomiony .

Alex Essilfie
źródło
1
Czy przez break rozumiesz, czy masz na myśli zmusić go do wyjścia?
RK,
@RK: Tak, chcę zmusić go do wyjścia w dowolnym momencie, ponieważ (1) widziałem niepożądane wyjście, (2) wprowadziłem niewłaściwą kolejność przetwarzania, (3) z jakiegokolwiek innego powodu.
Alex Essilfie,
2
Właśnie sprawdziłem możliwe skróty klawiaturowe. Ctrl + Z, Ctrl + C i ESC nie działają. Może być konieczne użycie IDLE lub innego IDE, aby osiągnąć pożądany efekt.
RK,
użyj ctrl + Z w terminalu lx dla maszyny z systemem Windows
@anurag: Dziękuję za sugestię, ale nie tego pragnę. Chcę zatrzymać wykonywanie w oknie Pythona w ArcMap, bez używania IDE lub terminalu. Wiem już, jak zakończyć wykonywanie w terminalu lub IDE.
Alex Essilfie

Odpowiedzi:

14

Właśnie go przetestowałem i ESC też nie działa. ArcGIS po prostu zawiesza się na chwilę, a następnie kontynuuje. Wydaje się, że nie ma sposobu, aby wymusić zamknięcie go po uruchomieniu w konsoli ArcGIS Python. Nie możesz go zabić za pomocą Menedżera zadań, ponieważ proces Pythona tam się nie pojawia.

Jeśli naprawdę chcesz wymusić jego zamknięcie, możesz rozważyć użycie IDE, takiego jak IDLE, zamiast robić to w konsoli ArcGIS Python. Na przykład w IDLE możesz użyć Ctrl+ Zlub Ctrl+, Caby zakończyć wykonywanie.

RK
źródło
1
Okno ArcGIS Pro Python pozwala zatrzymać kod Pythona podczas jego wykonywania, z powodu ograniczeń technologicznych okno ArcGIS 10.X nie może.
Jason Scheirer
9

Oto metoda, której używam:

  • utwórz mały skrypt Pythona o nazwie kill_processx.py
  • Po uruchomieniu kill_processx tworzy mały plik testowy o nazwie stop_processx.txt.
  • Na górze lub na dole pętli w programie głównym sprawdź, czy istnieje plik stop_processx.txt.
  • Jeśli istnieje, wykonaj wszelkie potrzebne procedury czyszczenia, a następnie zatrzymaj się z gracją.
  • Usuń plik stop_processx.txt

przykład pliku 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
źródło
Jaki skrypt nazywasz „kill_processx.py”?
Aaron
1
skrypt kill_process tworzy pusty plik txt o poprawnej nazwie w odpowiednim folderze.
mhoran_psprep
Czy możesz zamieścić przykładowy skrypt w swoim poście, abyśmy mogli lepiej zrozumieć, w jaki sposób może to pomóc w pytaniu PO?
Aaron
@mhoran_psprep: Zaakceptowałem odpowiedź RK, ponieważ odpowiada ona na pytanie (nie jest to możliwe, chyba że w IDE). +1 za obejście. Chyba zaimplementuję to w przyszłości.
Alex Essilfie,
4

Wymuszanie zamknięcia przy użyciu taktyk brutalnej siły jest złą praktyką. Raczej, jak wskazał @Aragon, należy dodać obsługę skryptów do skryptu, aby wyodrębnić komponenty i / lub zatrzymać skrypt, jeśli nie zostaną spełnione określone warunki. Jak wskazuje @RK, konsola python ArcGIS jest prawie bezwartościowa do uruchamiania skomplikowanych skryptów i, w praktyce, powinna być zarezerwowana dla prostych operacji - trzymaj się IDLE , pythonwin , pyscripter lub dowolnego z wielu innych IDE. Oto dyskusje związane z Twoim pytaniem:

Jak użyć sys.exit (0) w skrypcie arcpy, aby wyjść wcześniej bez wyświetlania komunikatu o błędzie?

Zakończenie skryptu Python

Jak zatrzymać polecenie lub monit w Pythonie?

Aaron
źródło
1
I oczywiście za pomocą IDE, takiego jak PyScripter, możesz po prostu dodać „punkt przerwania” do instrukcji „for ... range”, uruchomić skrypt w „trybie debugowania”, a IDE automatycznie „zatrzyma” się w tym samym czasie wskaż podczas procesu iteracyjnego i pozwól ci sprawdzić wyniki, które zostały już przetworzone.
RyanKDalton-OffTheGridMaps
2

Pracuję w wersji 10.4 i stwierdziłem, że mogę kliknąć zamknij X wprowadź opis zdjęcia tutajpodczas działania skryptu. ArcMap zapyta mnie, czy chcę anulować operację.

wprowadź opis zdjęcia tutaj

Klikam Tak. ArcMap pyta mnie, czy chcę zapisać przed wyjściem. Klikam Anuluj. Skrypt generuje przerwanie klawiatury.

Emil Brundage
źródło
Który przycisk zamykania klikasz, aby uruchomić tę sekwencję akcji?
Alex Essilfie,
Windows czerwony X w prawym górnym rogu większości (wszystkich?) Programów Windows. Zobacz małe zdjęcie w mojej odpowiedzi.
Emil Brundage,
1

jeśli chcesz rozwiązać w pythonowy sposób, spróbuj tego:

import sys
sys.exit()

albo użyj:

raise SystemExit()

szczegółowo:

import time
import sys

sTime= time.time()

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

Mam nadzieję, że Ci to pomoże...

Aragonia
źródło
Nie, nie tego chcę. Chcę zatrzymać proces w dowolnym momencie, naciskając kombinację klawiszy, klikając przycisk lub coś podobnego, gdy kod, który wprowadziłem w oknie konsoli, jest uruchomiony . Wiem o sys.exit()tym, ale to nie działa, gdy działa pętla lub podobnie długi proces.
Alex Essilfie,
@Upvoters: to nie jest odpowiedź, której szukam. To nie odpowiada na moje pytanie . Chcę przerwać wykonywanie instrukcji (zwykle iteracji), naciskając kombinację klawiszy lub klikając przycisk lub coś podobnego.
Alex Essilfie,
1

Możesz to zrobić przynajmniej w ArcMap 10.4. Upewnij się, że okno „Wyniki” jest widoczne. (Jeśli nie, znajdź go w „Geoprocessing”). Teraz, jeśli masz uruchomione polecenie, pojawi się ono w tym oknie. Kliknij go prawym przyciskiem myszy i naciśnij „anuluj”.

H.Durham
źródło
0

Korzystając z IDLE, mam plik o nazwie „stop.py”, który zawiera pojedynczą linię: „pass”. Trzymaj ten plik otwarty w IDLE, gdy uruchomiony jest inny skrypt .py. Kliknięcie F5 w oknie „stop.py” resetuje IDLE.

nbcaldon
źródło