Come interrompere manualmente l'esecuzione dell'istruzione nella finestra Python di ArcMap?


20

Come si interrompe l'esecuzione di un processo di lunga durata nella console Python di ArcMap?

Ad esempio, come si interrompe una lunga iterazione come quella seguente una volta avviata?

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

Voglio interrompere il processo in qualsiasi momento, premendo una combinazione di tasti, facendo clic su un pulsante o qualcosa di simile mentre il codice che ho inserito nella finestra della console è in esecuzione .


1
Per pausa intendi dire forzarlo a smettere?
RK,

@RK: Sì, voglio forzarlo ad uscire in qualsiasi momento, perché (1) ho visto un output indesiderato, (2) ho inserito un ordine di elaborazione errato, (3) qualsiasi altro motivo.
Alex Essilfie,

2
Ho appena controllato le possibili scorciatoie da tastiera. Ctrl + Z, Ctrl + C ed ESC non funzionano tutti. Potrebbe essere necessario utilizzare IDLE o un altro IDE per ottenere ciò che desideri.
RK,

usa ctrl + Z nel terminale lx per windows machine

@anurag: Grazie per il tuo suggerimento, ma non è quello che desidero. Quello che voglio è fermare l'esecuzione all'interno della finestra di Python in ArcMap, non usando un IDE o un Terminale. So già come terminare l'esecuzione in un terminale o IDE.
Alex Essilfie,

Risposte:


14

L'ho appena provato e ESC non funziona neanche. ArcGIS si blocca solo per un momento e poi continua. Non sembra esserci un modo per forzare la sua chiusura una volta eseguito nella console ArcGIS Python. Non è possibile ucciderlo utilizzando Task Manager poiché il processo Python non viene visualizzato qui.

Se vuoi davvero essere in grado di forzarlo a smettere, potresti prendere in considerazione l'uso di un IDE come IDLE piuttosto che farlo nella console ArcGIS Python. In IDLE, ad esempio, è possibile utilizzare Ctrl+ Zo Ctrl+ Cper terminare l'esecuzione.


1
La finestra ArcGIS Pro Python consente di interrompere il codice Python mentre è in esecuzione, a causa delle limitazioni tecnologiche che la finestra ArcGIS 10.X non può.
Jason Scheirer,

9

Questo è il metodo che uso:

  • crea un piccolo script Python chiamato kill_processx.py
  • Quando viene eseguito kill_processx crea un piccolo file di test chiamato stop_processx.txt.
  • Nella parte superiore o inferiore del ciclo nel programma principale controlla se esiste stop_processx.txt.
  • Se esiste, eseguire tutte le routine di pulizia necessarie, quindi interrompere con garbo.
  • Elimina il file stop_processx.txt

esempio di un file 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()

Qual è lo script che chiami "kill_processx.py"?
Aaron

1
lo script kill_process crea semplicemente un file txt vuoto con il nome corretto nella cartella corretta.
mhoran_psprep,

Potresti per favore includere uno script di esempio nel tuo post, così possiamo avere un'idea migliore di come ciò potrebbe aiutare con la domanda del PO?
Aaron

@mhoran_psprep: ho accettato la risposta di RK perché risponde alla domanda (non è possibile se non in un IDE). +1 per la soluzione alternativa. Immagino che lo implementerò in futuro.
Alex Essilfie,

4

È una cattiva pratica forzare l'arresto usando tattiche di forza bruta. Piuttosto, come ha sottolineato @Aragon, è necessario aggiungere la gestione degli errori allo script per isolare i componenti e / o interrompere lo script se non sono soddisfatte determinate condizioni. Come sottolineato da @RK, la console python di ArcGIS è quasi inutile per l'esecuzione di script complessi e, in pratica, dovrebbe essere riservata per semplici operazioni: attenersi a IDLE , pythonwin , pyscripter o a qualsiasi host di altri IDE. Ecco le discussioni relative alla tua domanda:

Come posso usare sys.exit (0) in uno script arcpy per uscire presto senza che venga visualizzato un messaggio di errore?

Terminare uno script Python

Come interrompere un comando o un prompt in Python?


1
E, naturalmente, con un IDE come PyScripter, puoi semplicemente aggiungere un "punto di interruzione" alla tua istruzione "for ... range", eseguire lo script in "modalità debug" e l'IDE si "metterà automaticamente in pausa" allo stesso durante il processo iterativo e consentire di ispezionare i risultati che sono già stati elaborati.
RyanKDalton-OffTheGridMaps

2

Sto lavorando in 10.4 e ho scoperto che posso fare clic sulla X chiusa inserisci qui la descrizione dell'immaginementre è in esecuzione uno script. ArcMap mi chiederà se voglio annullare un'operazione.

inserisci qui la descrizione dell'immagine

Faccio clic su Sì. ArcMap mi chiede quindi se voglio salvare prima di uscire. Faccio clic su Annulla. Lo script genera un'interruzione da tastiera.


Su quale pulsante di chiusura fai clic per attivare questa sequenza di azioni?
Alex Essilfie,

La X rossa di Windows in alto a destra nella maggior parte dei software Windows (tutti?). Vedi la piccola foto nella mia risposta.
Emil Brundage,

1

se vuoi risolvere in modo pitonico, prova questo:

import sys
sys.exit()

o utilizzare:

raise SystemExit()

in dettaglio:

import time
import sys

sTime= time.time()

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

spero che ti aiuti ...


No, questo non è quello che voglio. Voglio interrompere il processo in qualsiasi momento premendo una combinazione di tasti, facendo clic su un pulsante o qualcosa di simile mentre il codice che ho inserito nella finestra della console è in esecuzione . Sono a conoscenza, sys.exit()ma non funziona quando è in esecuzione un ciclo o un processo altrettanto lungo.
Alex Essilfie,

@Upvoters: questa non è la risposta che sto cercando. Non risponde alla mia domanda . Voglio interrompere l'esecuzione di un'istruzione (in genere iterazione) premendo una combinazione di tasti o facendo clic su un pulsante o qualcosa di simile.
Alex Essilfie,

1

Almeno in ArcMap 10.4, puoi farlo. Assicurati che la finestra "Risultati" sia visibile. (Se non lo trovi in ​​"Geoprocessing"). Ora se hai un comando in esecuzione, apparirà in questa finestra. Fare clic destro su di esso e premere "Annulla".



0

Usando IDLE, ho un file chiamato "stop.py" che contiene la singola riga: "pass". Mantenere questo file aperto in IDLE mentre è in esecuzione un altro script .py. Facendo clic su F5 nella finestra "stop.py" si ripristina IDLE.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.