Los errores en el código son inevitables, y hay dos métodos básicos para saber dónde se han producido:
- Agregar algún tipo de declaración print para ayudarle a aislar el problema.
- Usar un depurador interactivo.
Usar imprimir declaraciones
El uso de declaraciones print para describir errores en el código es un método evidente y común. Dado que las herramientas de secuencia de comandos tienen acceso al cuadro de diálogo de progreso, puede editar su secuencia de comandos para que incluya llamadas a AddMessage(), AddWarning() o AddError() para imprimir valores y mensajes de punto de comprobación al cuadro de diálogo de progreso. Otra variación consiste en utilizar un método independiente de devolución de mensajes, como el método MessageBox del módulo win32ui. Este método muestra un cuadro de diálogo emergente. Dado que tiene que hacer clic en Aceptar en el cuadro de diálogo para continuar la ejecución, este método permite controlar el ritmo de la ejecución de la secuencia de comandos. A continuación se muestra un ejemplo de uso de ambos métodos:
import arcpy
import win32ui
import win32con
n = 5
# Print message to progress dialog
#
arcpy.AddMessage("Value of n = {}".format(n))
# Issue a popup dialog with OK and Cancel button
#
val = win32ui.MessageBox("Value of n = {}".format(n), "title",
win32con.MB_OKCANCEL)
# Based on the button clicked, you can branch execution
#
if val == 1:
arcpy.AddMessage("You clicked OK")
else:
arcpy.AddError("You clicked Cancel")
raise arcpy.ExecuteError, "Execution stops due to Cancel button click"
arcpy.AddMessage("This statement reached")
Usar depuradores
El otro método consiste en usar un entorno de desarrollo integrado (IDE) de Python que admita depuración. Los depuradores permiten establecer puntos de corte, entrar, salir y situarse sobre líneas de código individuales, así como examinar el contenido de las variables, todo ello sin modificar el código. Comparados con la inserción de declaraciones print, los depuradores son muchos más eficientes y normalmente le permite aislar el error rápidamente.
Entre las IDE más comunes se encuentran:
- El IDE de Python que se instala con Python
- PythonWin, disponible en la Web en https://sourceforge.net/projects/pywin32
- PyScripter, disponible en la Web en http://code.google.com/p/pyscripter
- Sistemas comerciales, como Wing IDE (http://wingware.com)
Una forma de usar un depurador es abrir sus secuencias de comandos directamente en el IDE, modificarlo de forma que todos los parámetros tengan valores, y luego continuar con depurar. Esto funciona razonablemente bien en casos sencillos. No obstante, si su secuencia de comandos utiliza parámetros de visualización de capa o tabla, estas variables deben crearse en el momento. Los parámetros complejos, como un mapa de campo o una referencia espacial son difíciles de crear como variables.
Lo ideal para usted es poder abrir su cuadro de diálogo herramienta de secuencia de comandos, introducir los parámetros y hacer que se inicie un IDE con su código listo para ser depurado. Puede hacer esto con unos pocos cambios, que se describen a continuación.
Usar GetParameterAsText()
El primer paso es modificar su secuencia de comandos para que utilice GetParameterAsText () en lugar de sys. argv [], tal y como se discutió en Entender los parámetros de la herramienta de secuencia de comandos. Esta es una modificación que puede conservar, no es necesario volver a cambiar el código para usar sys.argv[].
Ejecute y depure su herramienta
- Configure Depurador (como PythonWin) en Geoprocesamiento > Opciones de geoprocesamiento.
- En la ventana deCatálogo, haga clic con el botón derecho del ratón en su herramienta y haga clic en Depurar.
- Abra la herramienta de secuencia de comandos desde la caja de herramientas, introduzca los parámetros que desee configurar y, a continuación, haga clic en Aceptar. El IDE puede tardar algunos momentos en abrirse. Se muestra el código de la secuencia de comandos y se puede interactuar libremente con la aplicación de depuración como se haría normalmente.
Puede establecer un punto de interrupción y dejar que la secuencia de comandos se ejecute hasta el mismo, así como usar otras opciones que permita el depurador. A los valores de parámetro introducidos en el cuadro de diálogo los escoge GetParameterAsText().
Al ejecutar la secuencia de comandos, se seguirá produciendo cualquier interacción que esperaría normalmente entre la secuencia de comandos y la aplicación. Así, si está usando funciones como AddMessage(), AddWarning () o AddError (), estos mensajes aparecerán en la aplicación. Si utiliza las funciones de progressor, éste se actualizará en el cuadro de diálogo de la herramienta a medida que avance por la secuencia de comandos. Una vez terminada la secuencia de comandos, puede volver a la aplicación cerrando el depurador. O bien, si tiene la intención de depurar su herramienta de secuencia de comandos una segunda vez, puede mantener el depurador abierto y hacer clic en Cancelar en el cuadro de diálogo de progreso de la herramienta.