Debug degli script ArcPy?


50

Ho scritto molti script Python usando ArcPy in ArcGIS 10 e finora il mio unico mezzo di debug è limitato alla stampa di messaggi nella finestra dei risultati di geoprocessing arcpy.AddMessage().

Ci sono altre opzioni là fuori, come l'impostazione dei punti di interruzione?

Il metodo di Jason funziona alla grande. Se hai un bug nella tua cassetta degli attrezzi, come la validazione, probabilmente il tuo IDE non sarà in grado di individuare il problema perché le cassette degli attrezzi sono codificate. Almeno WING non è stato in grado di individuarlo.


Forse un'opzione qui? codice google pyscripter
Brad Nesom

La guida di ArcGIS spiega come utilizzare il debugger in PythonWin
Regan Sarwas

Nelle proprietà del file OS, hai provato a impostare il programma predefinito per i file .py su PyScripter?
KiloGeo,

In questo modo, non direi in modo efficace al sistema operativo che non volevo eseguire il mio script Python, ma piuttosto aprirlo nell'editor?
Ryan Dalton,

Si corretto. Mi dispiace di aver frainteso il tuo scopo.
KiloGeo,

Risposte:


37

Di solito i debugger / IDE di Python presumono che lo script Python sia in esecuzione nello stesso processo di se stesso, quindi il debug di uno script in esecuzione in ArcMap.exe è immediato - è necessario ottenere abbastanza dell'ambiente di script GP avviato in uno script Python come si può debug con.

Un metodo che ha funzionato molto bene per me negli ultimi anni è quello di scrivere un semplice script che chiama semplicemente lo strumento e lo usa come mio script principale nell'IDE Python (Wing o Pythonwin) e ha i miei punti di interruzione impostati nel .py dello strumento il file si apre anche nella stessa sessione IDE.

Quindi sostanzialmente faccio questo:

  1. Ottieni l'insieme di input che non funzionano nel mio strumento di script
  2. Apri un semplice file .py nella stessa cartella del .tbx che chiama lo strumento
  3. Aprire lo script del chiamante e il file .py dello strumento di script nell'IDE
  4. Impostare i punti di interruzione nel file dello strumento di script
  5. Esegui lo script del chiamante

E il mio script per i chiamanti è di solito piuttosto semplice:

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

Ho provato winpdb per eseguire il debug degli script in esecuzione in ArcMap ma non ho mai avuto fortuna. Se vuoi provarlo e farlo funzionare bene, ti preghiamo di condividere i tuoi risultati.


1
bella soluzione! lo proverò.
George Silva,

Ho usato winpdb con successo in passato per eseguire il debug di script a lungo processo. winpdb, una volta impostato, ti permette di "saltare dentro" uno script autonomo attualmente in esecuzione o teoricamente uno all'interno di un altro processo come ArcMap e debug normalmente. Questo è stato molto utile per il check-in su uno script che avrebbe richiesto settimane per il completamento. Tuttavia, non ho provato a eseguire il debug di arcpy all'interno di un processo di applicazione ArcGIS.
blah238,

Consiglierei PyCharm. funziona come per magia
user39901230

26

Puoi cambiarlo dalla finestra di dialogo delle opzioni GP, basta puntare al tuo eseguibile preferito per l'editor / debugger.

Finestra di dialogo Impostazioni GP


Questo sembra essere un nuovo miglioramento per ArcGIS 10, giusto? Non vedo questa opzione di impostazione per 9.3.
Ryan Dalton,

Corretto, nuovo in 10.
Jason Scheirer

9

Per gli utenti di 10 anni, chiaramente il percorso migliore da percorrere è con il post di Jason, che ho contrassegnato come "la migliore risposta". Per gli utenti di 9.3, sono stato in grado di seguire le istruzioni di supporto KB ESRI collegate nel post di Brad per farlo funzionare.

Alla fine, la chiave per arrivare alla modifica predefinita degli script Python di ArcGIS in Pyscripter era modificare l '"azione" di sistema per i "tipi di file registrati" che terminavano con i file * .py (passaggio # 4). Ho creato un nuovo tipo di azione "Modifica" e quindi ho incluso il percorso Pyscripter.exe. Una volta fatto questo, l'azione di modifica predefinita è stata impostata per avviare Pyscripter anziché IDLE.

La stringa che ho usato (perché è stata tagliata nella finestra di dialogo mostrata di seguito) è:

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

inserisci qui la descrizione dell'immagine


1
+1 per la risposta, e ancora, se potessi, per includere la stringa e non solo un'immagine (il testo è molto più facile da copiare e incollare!).
matt wilkie,

7

Non so come funzionerà con arcpy, ma puoi provare pdb :

import pdb; pdb.set_trace()

esiste una funzionalità simile per pydev con eclipse, che è descritta qui. Impostate eclipse per l'ascolto di un segnale e potete attivarlo nel codice in esecuzione completamente al di fuori di eclipse mediante una chiamata di funzione pydevd.settrace (). urbansim.org/Documentation/DebuggingWithEclipse
ako

0

Il modo più semplice che ho trovato per eseguire il debug del mio codice è codificare i miei input nel percorso di un file di set di dati esistente. Per esempio:

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"

Oltre alla finestra dei risultati, la finestra di Python genera utili messaggi di errore e / o consente di testare frammenti di codice.

Ogni buon IDE ha una sonda di debug che avrà, in memoria, tutta la tua elaborazione fino al punto di interruzione corrente. Con ciò, puoi vedere cosa sta succedendo con i dati. Impostare i punti di interruzione in cui si desidera mettere in pausa lo script. Utilizzare i punti di interruzione condizionali se si desidera interrompere un ciclo a una iterazione specifica. Inoltre, conosci le tue versioni Arc e quali funzioni sono disponibili per quelle versioni.

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.