¿Depuración de scripts de ArcPy?

50

He escrito muchos scripts de Python usando ArcPy en ArcGIS 10, y hasta ahora mi único medio de depuración está restringido a imprimir mensajes en la ventana de resultados de geoprocesamiento arcpy.AddMessage().

¿Existen otras opciones, como establecer puntos de ruptura?

El método de Jason funciona muy bien. Si tiene un error en su caja de herramientas, como la validación, su IDE probablemente no podrá identificar el problema porque las cajas de herramientas están codificadas. Al menos WING no pudo identificarlo.

Curtidor
fuente
Tal vez una opción aquí? code google pyscripter
Brad Nesom
La ayuda de ArcGIS analiza cómo usar el depurador en PythonWin
Regan Sarwas
En las propiedades del archivo del sistema operativo, ¿ha intentado configurar el programa predeterminado para archivos .py en PyScripter?
KiloGeo
Al hacer esto, ¿no estaría diciéndole efectivamente al sistema operativo que no quería ejecutar mi script de Python, sino simplemente abrirlo en el editor?
RyanDalton
Sí correcto. Lo siento, entendí mal tu propósito.
KiloGeo

Respuestas:

37

Por lo general, los depuradores / IDE de Python asumen que el script de Python se está ejecutando en el mismo proceso que él mismo, por lo que la depuración de un script que se ejecuta en ArcMap.exe es inmediata: debe obtener suficiente del entorno de scripting GP arrancado en un script de Python como pueda para depurar con.

Un método que me ha funcionado muy bien en los últimos años es escribir un script simple que simplemente llame a la herramienta y usarlo como mi script principal en Python IDE (Wing o Pythonwin) y tener mis puntos de interrupción establecidos en la herramienta .py El archivo también se abre en la misma sesión IDE.

Entonces básicamente hago esto:

  1. Obtener el conjunto de entradas que no funcionan en mi herramienta de script
  2. Abra un archivo .py simple en la misma carpeta que el .tbx que llama a la herramienta
  3. Abra el script de llamada y el archivo .py de la herramienta de script en el IDE
  4. Establecer puntos de interrupción en el archivo de herramienta de script
  5. Ejecute el script de llamada

Y mi script de llamada suele ser bastante simple:

import os
import arcpy
arcpy.ImportToolbox(os.path.join(os.path.dirname(__file__), 'my.tbx'))
arcpy.MyToolThatIsFailing_myalias("inputs", "that", "don't" "work")

He intentado winpdb para depurar scripts que se ejecutan en ArcMap pero nunca he tenido suerte. Si quiere probarlo y consigue que funcione bien, comparta sus hallazgos.

Jason Scheirer
fuente
1
buena solución! voy a probarlo.
George Silva
He usado winpdb con éxito en el pasado para depurar scripts de proceso largo. winpdb, una vez configurado, le permite "saltar" a un script independiente actualmente en ejecución o, teóricamente, a uno dentro de otro proceso como ArcMap y depurarlo normalmente. Esto fue muy útil para verificar un script que tardaría semanas en completarse. Sin embargo, no he intentado depurar arcpy dentro de un proceso de aplicación ArcGIS.
blah238
Recomiendo PyCharm. funciona como magia
user39901230
26

Puede cambiarlo desde el diálogo de opciones de GP, solo apunte a su ejecutable de elección para editor / depurador.

Diálogo de configuración de GP

Jason Scheirer
fuente
Esto parece ser una nueva mejora para ArcGIS 10, ¿correcto? No veo esta opción de configuración para 9.3.
RyanDalton
Correcto, nuevo en 10.
Jason Scheirer
9

Para los usuarios de 10 años, claramente la mejor ruta es la publicación de Jason, que marqué como la "mejor respuesta". Para los usuarios de 9.3, pude seguir las instrucciones de soporte de ESRI KB vinculadas en la publicación de Brad para que funcionara.

En última instancia, la clave para acceder a la edición predeterminada de los scripts de Python de ArcGIS en Pyscripter era editar la "acción" del sistema para "tipos de archivos registrados" que terminaban en archivos * .py (paso # 4). Creé un nuevo tipo de acción "Editar" y luego incluí la ruta Pyscripter.exe. Una vez que hice esto, la acción de edición predeterminada se configuró para iniciar Pyscripter en lugar de IDLE.

La cadena que utilicé (porque se cortó en el cuadro de diálogo que se muestra a continuación) es:

"C:\Program Files\PyScripter\PyScripter.exe" "%1"

ingrese la descripción de la imagen aquí

RyanDalton
fuente
1
+1 por la respuesta, y nuevamente, si pudiera, por incluir la cadena y no solo una imagen (¡el texto es mucho más fácil de copiar y pegar!).
Matt Wilkie
7

No sé cómo funcionará esto con arcpy, pero puedes probar pdb :

import pdb; pdb.set_trace()
nw1
fuente
Hay una funcionalidad similar para pydev con eclipse, que se describe aquí. Configura eclipse para escuchar una señal, y puede activarla en el código que se ejecuta completamente fuera del eclipse mediante una llamada a la función pydevd.settrace (). urbansim.org/Documentation/DebuggingWithEclipse
ako
0

La forma más directa que he encontrado para depurar mi código es codificar mis entradas en la ruta del archivo de un conjunto de datos existente. Por ejemplo:

import arcpy

# parameters for script
#input1 = arcpy.GetParameterAsText(0) # layer
#input2 = arcpy.GetParameterAsText(1) # folder

# debugging parameters
input1 = r"path/to/your/data.shp"
input2 = r"path/to/your/folder"

Además de la ventana de resultados, la ventana de Python genera mensajes de error útiles y / o le permite probar fragmentos de código.

Cualquier buen IDE tiene una sonda de depuración que tendrá, en la memoria, todo su procesamiento hasta el punto de interrupción actual. Con eso, puede ver lo que está sucediendo con los datos. Establezca puntos de interrupción donde desee pausar el script. Use puntos de interrupción condicionales si desea detener un bucle en una iteración específica. Además, conozca sus versiones de Arc y qué funciones están disponibles para esas versiones.

Gisdude
fuente