Déboguer des scripts ArcPy?

50

J'ai écrit de nombreux scripts Python à l'aide d'ArcPy dans ArcGIS 10, et jusqu'à présent, mon seul moyen de débogage est limité à l'impression de messages dans la fenêtre de résultats du géotraitement arcpy.AddMessage().

Existe-t-il d'autres options, telles que la définition de points d'arrêt?

La méthode de Jason fonctionne très bien. Si vous avez un bogue dans votre boîte à outils, tel que la validation, votre environnement de développement intégré ne sera probablement pas en mesure de localiser le problème car les boîtes à outils sont codées. Au moins, WING n'était pas capable de le localiser.

Tanneur
la source
Peut-être une option ici? code google pyscripter
Brad Nesom
L' aide d'ArcGIS explique comment utiliser le débogueur dans PythonWin
Regan Sarwas
Dans les propriétés du fichier du système d'exploitation, avez-vous essayé de définir le programme par défaut pour les fichiers .py sur PyScripter?
KiloGeo
En faisant cela, est-ce que je ne dirais pas efficacement au système d'exploitation que je ne voulais pas exécuter mon script python, mais plutôt simplement l'ouvrir dans l'éditeur?
RyanDalton
Oui correct. Désolé j'ai mal compris votre but.
KiloGeo

Réponses:

37

Les débogueurs / IDE Python supposent généralement que le script Python s’exécute dans le même processus. Le débogage d’un script s’exécutant dans ArcMap.exe est donc immédiatement terminé. déboguer avec.

Une méthode qui a très bien fonctionné pour moi ces dernières années consiste à écrire un script simple qui appelle simplement l'outil et à l'utiliser comme script principal dans l'EDI Python (Wing ou Pythonwin) et à définir mes points d'arrêt dans le fichier .py de l'outil. fichier également ouvert dans la même session IDE.

Donc, fondamentalement, je fais ceci:

  1. Obtenir le jeu d'entrées qui ne fonctionnent pas dans mon outil de script
  2. Ouvrez un simple fichier .py dans le même dossier que le .tbx qui appelle l'outil
  3. Ouvrez le script de l'appelant et le fichier .py de l'outil de script dans l'EDI
  4. Définir des points d'arrêt dans un fichier d'outil de script
  5. Exécuter le script de l'appelant

Et mon script d'appelant est généralement assez simple:

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

J'ai essayé avec winpdb de déboguer des scripts exécutés dans ArcMap, mais je n'ai jamais eu de chance. Si vous voulez l'essayer et le faire fonctionner correctement, partagez vos découvertes.

Jason Scheirer
la source
1
belle solution! je vais essayer.
George Silva
Par le passé, j’ai utilisé winpdb avec succès pour déboguer des scripts de processus long. winpdb, une fois configuré, vous permet de "sauter" dans un script autonome en cours d’exécution ou, théoriquement, dans un autre processus tel que ArcMap et de le déboguer normalement. C'était très pratique pour vérifier un script qui prendrait des semaines. Je n'ai toutefois pas essayé de déboguer Arcpy dans le cadre d'un processus d'application ArcGIS.
blah238
Je recommanderais PyCharm. cela fonctionne comme par magie
user39901230
26

Vous pouvez le modifier à partir de la boîte de dialogue des options du GP, il vous suffit de pointer sur l'exécutable de votre choix pour l'éditeur / le débogueur.

Boîte de dialogue Paramètres de stratégie de groupe

Jason Scheirer
la source
Cela semble être une nouvelle amélioration pour ArcGIS 10, n'est-ce pas? Je ne vois pas cette option de réglage pour 9.3.
RyanDalton
Correct, nouveau dans 10.
Jason Scheirer
9

Pour les utilisateurs de 10, le meilleur chemin à suivre est clairement le message de Jason, que j'ai qualifié de "meilleure réponse". Pour les utilisateurs de la version 9.3, j'ai pu suivre les instructions du support technique ESRI KB liées dans le message de Brad pour le faire fonctionner.

En fin de compte, la clé pour accéder à l'édition par défaut des scripts ArcGIS Python dans Pyscripter consistait à éditer "l'action" du système pour les "types de fichiers enregistrés" se terminant par des fichiers * .py (étape 4). J'ai créé un nouveau type d'action "Modifier" puis inclus le chemin Pyscripter.exe. Une fois que j'ai fait cela, l'action d'édition par défaut a été configurée pour lancer Pyscripter au lieu de IDLE.

La chaîne que j'ai utilisée (car elle a été coupée dans la boîte de dialogue ci-dessous) est la suivante:

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

entrez la description de l'image ici

RyanDalton
la source
1
+1 pour la réponse, et encore une fois, si je pouvais, pour inclure la chaîne et pas seulement une image (le texte est tellement plus facile à copier et coller!).
Matt Wilkie
7

Je ne sais pas comment cela fonctionnera avec arcpy, mais vous pouvez essayer pdb :

import pdb; pdb.set_trace()
nw1
la source
Il existe une fonctionnalité similaire pour pydev avec Eclipse, décrite ici. Vous définissez eclipse pour écouter un signal et vous pouvez le déclencher dans le code entièrement externe à eclipse par un appel de fonction pydevd.settrace () urbansim.org/Documentation/DebuggingWithEclipse
ako
0

Le moyen le plus simple que j'ai trouvé pour déboguer mon code est de coder en dur mes entrées dans le chemin de fichier d'un ensemble de données existant. Par exemple:

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"

Outre la fenêtre de résultats, la fenêtre python génère des messages d'erreur utiles et / ou vous permet de tester des extraits de code.

Tout bon IDE a une sonde de débogage qui aura, en mémoire, tous vos traitements jusqu’au point de rupture actuel. Avec cela, vous pouvez voir ce qui se passe avec les données. Définissez les points d'arrêt où vous souhaitez suspendre le script. Utilisez des points d'arrêt conditionnels si vous souhaitez arrêter une boucle à une itération spécifique. Vous devez également connaître vos versions Arc et les fonctions disponibles pour ces versions.

gisdude
la source