¿Cómo interrumpir manualmente la ejecución de la declaración en la ventana de Python de ArcMap?

20

¿Cómo se interrumpe la ejecución de un proceso de larga duración en la consola de Python de ArcMap?

Por ejemplo, ¿cómo se rompe una iteración larga como la siguiente una vez que se inicia?

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

Quiero detener el proceso en cualquier momento que desee presionando una combinación de teclado, haciendo clic en un botón o algo similar mientras se ejecuta el código que ingresé en la ventana de la consola .

Alex Essilfie
fuente
1
¿Por descanso quieres decir obligarlo a renunciar?
RK
@RK: Sí, quiero forzarlo a salir en cualquier momento que quiera, porque (1) he visto una salida no deseada, (2) he ingresado el orden de procesamiento incorrecto, (3) cualquier otra razón.
Alex Essilfie
2
Acabo de comprobar los posibles atajos de teclado. Ctrl + Z, Ctrl + C y ESC no funcionan. Es posible que necesite usar IDLE u otro IDE para lograr lo que desea.
RK
use ctrl + Z en la terminal lx para la máquina windows
@anurag: Gracias por su sugerencia, pero eso no es lo que deseo. Lo que quiero es detener la ejecución dentro de la ventana de Python en ArcMap, sin usar un IDE o Terminal. Ya sé cómo terminar la ejecución en un terminal o IDE.
Alex Essilfie

Respuestas:

14

Solo lo probé y ESC tampoco funciona. ArcGIS simplemente se congela por un momento y luego continúa. No parece haber una manera de forzar el cierre una vez que se ejecuta en la consola Python de ArcGIS. No puede eliminarlo con el Administrador de tareas, ya que el proceso de Python no aparece allí.

Si realmente quiere poder forzar el cierre, puede considerar usar un IDE como IDLE en lugar de hacerlo en la consola de ArcGIS Python. En IDLE, por ejemplo, puede usarCtrl + Zo Ctrl+ Cpara terminar la ejecución.

RK
fuente
1
La ventana ArcGIS Pro Python le permite detener el código Python mientras se está ejecutando, debido a limitaciones tecnológicas que la ventana ArcGIS 10.X no puede.
Jason Scheirer
9

Este es el método que uso:

  • crear un pequeño script de python llamado kill_processx.py
  • Cuando se ejecuta kill_processx crea un pequeño archivo de prueba llamado stop_processx.txt.
  • En la parte superior o inferior del bucle en el programa principal, verifique si existe stop_processx.txt.
  • Si existe, ejecute las rutinas de limpieza que necesite, luego deténgase con gracia.
  • Eliminar el archivo stop_processx.txt

ejemplo de un archivo 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
fuente
¿Cuál es el script que llamas "kill_processx.py"?
Aaron
1
el script kill_process solo crea un archivo txt vacío con el nombre correcto en la carpeta correcta.
mhoran_psprep
¿Podría incluir un script de muestra en su publicación, para que podamos tener una mejor idea de cómo esto podría ayudar con la pregunta del OP?
Aaron
@mhoran_psprep: He aceptado la respuesta de RK porque responde la pregunta (no es posible a menos que sea en un IDE). +1 para su solución alternativa. Supongo que lo implementaré en el futuro.
Alex Essilfie
4

Es una mala práctica forzar el apagado utilizando tácticas de fuerza bruta. Más bien, como señaló @Aragon, debe agregar el manejo de errores a su secuencia de comandos para aislar los componentes y / o detener la secuencia de comandos si no se cumplen ciertas condiciones. Como señala @RK, la consola Python de ArcGIS no tiene ningún valor para ejecutar scripts complejos y, en la práctica, debe reservarse para operaciones simples: quédese con IDLE , pythonwin , pyscripter o cualquiera de los hosts de otros IDEs. Aquí hay discusiones relacionadas con su pregunta:

¿Cómo uso sys.exit (0) en un script arcpy para salir temprano sin que aparezca un mensaje de error?

Terminar un script de Python

¿Cómo detener un comando o aviso en Python?

Aaron
fuente
1
Y, por supuesto, con un IDE como PyScripter, puede agregar un "punto de interrupción" en su declaración "for ... range", ejecutar el script en "modo de depuración", y el IDE "pausará" automáticamente al mismo tiempo apunte durante el proceso iterativo y le permitirá inspeccionar los resultados que ya se han procesado.
RyanKDalton-OffTheGridMaps
2

Estoy trabajando en 10.4, y descubrí que puedo hacer clic en cerrar X ingrese la descripción de la imagen aquímientras se ejecuta un script. ArcMap me preguntará si deseo cancelar una operación.

ingrese la descripción de la imagen aquí

Hago clic en Sí. ArcMap luego me pregunta si quiero guardar antes de salir. Hago clic en Cancelar. El guión arroja una interrupción de teclado.

Emil Brundage
fuente
¿En qué botón de cierre haces clic para activar esta secuencia de acción?
Alex Essilfie
La ventana X roja en la esquina superior derecha de la mayoría (¿todo?) Del software de Windows. Vea la pequeña foto en mi respuesta.
Emil Brundage
1

si quieres resolverlo de manera pitónica, prueba esto:

import sys
sys.exit()

o usar:

raise SystemExit()

en detalle:

import time
import sys

sTime= time.time()

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

Espero que te ayude...

Aragón
fuente
No, esto no es lo que quiero. Quiero detener el proceso en cualquier momento que desee presionando una combinación de teclado, haciendo clic en un botón o algo similar mientras se ejecuta el código que ingresé en la ventana de la consola . Soy consciente de sys.exit()que eso no funciona cuando se ejecuta un bucle o un proceso similarmente largo.
Alex Essilfie
@Upvoters: esta no es la respuesta que estoy buscando. No responde mi pregunta . Quiero interrumpir la ejecución de una declaración (generalmente iteración) presionando una combinación de teclado o haciendo clic en un botón o algo similar.
Alex Essilfie
1

Al menos en ArcMap 10.4, puede hacer esto. Asegúrese de que la ventana "Resultados" esté visible. (Si no lo encuentra en "Geoprocesamiento"). Ahora, si tiene un comando ejecutándose, aparecerá en esta ventana. Haga clic derecho sobre él y presione "cancelar".

H. Durham
fuente
0

Usando IDLE, tengo un archivo llamado "stop.py" que contiene la única línea: "pass". Mantenga este archivo abierto en IDLE mientras se ejecuta otro script .py. Al hacer clic en F5 en la ventana "stop.py" se restablece IDLE.

nbcaldon
fuente