20 votos

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

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

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

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

Quiero detener el proceso en el momento que quiera pulsando una combinación de teclado, haciendo clic en un botón o algo similar mientras se ejecuta el código que he introducido en la ventana de la consola .

1 votos

¿Por romper te refieres a forzarlo a dejar de fumar?

0 votos

@R.K.: Sí, quiero forzarlo a salir en cualquier momento que quiera, porque he (1) visto una salida no deseada, (2) he introducido una orden de procesamiento incorrecta, (3) cualquier otra razón.

2 votos

Acabo de comprobar los posibles atajos de teclado. Ctrl + Z, Ctrl + C y ESC no funcionan. Es posible que tenga que utilizar IDLE u otro IDE para lograr lo que quiere.

14voto

shsteimer Puntos 8749

Acabo de probarlo y ESC tampoco funciona. ArcGIS se congela por un momento y luego continúa. No parece haber una forma de forzar la salida una vez que se ejecuta en la consola de ArcGIS Python. No se puede matar usando el Administrador de tareas, ya que el proceso de Python no aparece allí.

Si realmente quieres ser capaz de forzar la salida, es posible que quieras considerar el uso de un IDE como IDLE en lugar de hacerlo en la consola de ArcGIS Python. En IDLE, por ejemplo, puede utilizar Ctrl + Z o Ctrl + C para terminar la ejecución.

1 votos

La ventana de ArcGIS Pro Python permite detener el código Python mientras se está ejecutando, debido a limitaciones tecnológicas que la ventana de ArcGIS 10.X no puede.

9voto

idursun Puntos 3648

Este es el método que utilizo:

  • crear un pequeño script 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 del programa principal comprueba si existe el archivo stop_processx.txt.
  • Si existe, ejecuta las rutinas de limpieza que necesites, y luego detente con elegancia.
  • 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()

0 votos

¿Cuál es el script que llamas "kill_processx.py"?

1 votos

El script kill_process sólo hace un archivo txt vacío con el nombre correcto en la carpeta correcta.

0 votos

¿Podría incluir un script de ejemplo en su post, para que podamos tener una mejor idea de cómo esto podría ayudar con la pregunta del OP?

4voto

Aaron Puntos 25882

Es una mala práctica forzar el cierre utilizando tácticas de fuerza bruta. En lugar de ello, como señaló @Aragon, debería añadir una gestión de errores a su secuencia de comandos para aislar los componentes y/o detener la secuencia de comandos si no se cumplen determinadas condiciones. Como señala @R.K., la consola python de ArcGIS es casi inútil para ejecutar scripts complejos y, en la práctica, debería reservarse para operaciones sencillas: utilice IDLE , pythonwin , pyscripter o cualquiera de los otros IDEs. Aquí hay discusiones relacionadas con su pregunta:

¿Cómo puedo usar sys.exit(0) en un script de arcpy para salir antes de tiempo sin que aparezca un mensaje de error?

Terminar un script de Python

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

1 votos

Y por supuesto, con un IDE como PyScripter, puedes simplemente añadir un "punto de ruptura" en tu declaración "for...range", ejecutar el script en "modo de depuración", y el IDE automáticamente "pausará" en el mismo punto durante el proceso iterativo y te permitirá inspeccionar los resultados que ya han sido procesados.

2voto

Tedy Puntos 46

Estoy trabajando en 10.4, y he descubierto que puedo hacer clic en el cierre X enter image description here mientras se ejecuta un script. ArcMap me preguntará si quiero cancelar una operación.

enter image description here

Hago clic en "Sí". ArcMap me pregunta entonces si quiero guardar antes de salir. Hago clic en Cancelar. El script lanza una interrupción del teclado.

1voto

texai Puntos 178

Si quieres resolver de forma 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...

0 votos

No, esto es no lo que quiero. Quiero detener el proceso en cualquier momento que desee pulsando una combinación de teclado, haciendo clic en un botón o algo similar mientras se ejecuta el código que he introducido en la ventana de la consola . Soy consciente de sys.exit() pero eso no funciona cuando se está ejecutando un bucle o un proceso igualmente largo.

0 votos

@Upvoters: esto es no la respuesta que estoy buscando. No responde a mi pregunta . Quiero romper la ejecución de una sentencia (típicamente la iteración) pulsando una combinación de teclado o haciendo clic en un botón o algo similar.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X