Debugowanie skryptów ArcPy?

50

Napisałem wiele skryptów Python za pomocą ArcPy w ArcGIS 10, a jak dotąd mój jedyny sposób debugowania ogranicza się do drukowania komunikatów w oknie wyników geoprzetwarzania arcpy.AddMessage().

Czy są jeszcze jakieś inne opcje, takie jak ustawianie punktów przerwania?

Metoda Jasona działa świetnie. Jeśli masz błąd w zestawie narzędzi, taki jak sprawdzanie poprawności, twoje IDE prawdopodobnie nie będzie w stanie zlokalizować problemu, ponieważ zestawy narzędzi są zakodowane. Przynajmniej WING nie był w stanie tego ustalić.

Garbarz
źródło
Może jest tu opcja? kod google pyscripter
Brad Nesom
Pomoc ArcGIS omawia sposób korzystania z debugera w
PythonWin
Czy we właściwościach pliku systemu operacyjnego próbowałeś ustawić domyślny program dla plików .py na PyScripter?
KiloGeo,
Czy w ten sposób nie powiedziałbym skutecznie systemowi operacyjnemu, że nie chcę uruchamiać skryptu python, ale po prostu otworzyć go w edytorze?
RyanDalton,
Tak, poprawnie. Przepraszam, nie zrozumiałem twojego celu.
KiloGeo 11.0411

Odpowiedzi:

37

Zwykle debugery / środowiska IDE Pythona zakładają, że skrypt Pythona działa w tym samym procesie, co on sam, więc debugowanie skryptu uruchomionego w ArcMap.exe jest od razu gotowe - musisz uzyskać wystarczającą ilość środowiska skryptowego GP uruchomionego w skrypcie Python, jak możesz debuguj z.

Metodą, która działała dla mnie bardzo dobrze w ciągu ostatnich kilku lat, jest napisanie prostego skryptu, który po prostu wywołuje narzędzie i używa go jako mojego głównego skryptu w Python IDE (Wing lub Pythonwin) i ustawiam punkty przerwania w pliku .py narzędzia plik otwarty również w tej samej sesji IDE.

Zasadniczo robię to:

  1. Uzyskaj zestaw danych wejściowych, które nie działają w moim narzędziu skryptowym
  2. Otwórz prosty plik .py w tym samym folderze co plik .tbx, który wywołuje narzędzie
  3. Otwórz skrypt wywołujący i plik .py narzędzia skryptowego w IDE
  4. Ustaw punkty przerwania w pliku narzędzia skryptowego
  5. Uruchom skrypt wywołujący

A mój skrypt wywołujący jest zwykle dość prosty:

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

Próbowałem winpdb do debugowania skryptów działających w ArcMap, ale nigdy nie miałem szczęścia. Jeśli chcesz go wypróbować i działa dobrze, podziel się swoimi odkryciami.

Jason Scheirer
źródło
1
fajne rozwiązanie! spróbuję.
George Silva,
W przeszłości z powodzeniem korzystałem z winpdb do debugowania skryptów o długim procesie. winpdb, po skonfigurowaniu pozwala „wskoczyć” do aktualnie działającego samodzielnego skryptu lub teoretycznie jednego w innym procesie, takim jak ArcMap i normalnie go debugować. Było to bardzo przydatne do sprawdzania skryptu, którego ukończenie zajęłoby tygodnie. Nie próbowałem jednak debugowania arcpy w procesie aplikacji ArcGIS.
blah238,
Poleciłbym PyCharm. działa jak magia
user39901230
26

Możesz to zmienić w oknie dialogowym opcji GP, po prostu wskaż swój plik wykonywalny do wyboru dla edytora / debuggera.

Okno dialogowe ustawień GP

Jason Scheirer
źródło
To wygląda na nowe ulepszenie ArcGIS 10, prawda? Nie widzę tej opcji ustawień dla 9.3.
RyanDalton,
Poprawnie, nowość w wersji 10.
Jason Scheirer,
9

Dla użytkowników w wieku 10 lat zdecydowanie najlepszą drogą jest post Jason, który oznaczyłem jako „najlepszą odpowiedź”. W przypadku użytkowników 9.3 mogłem postępować zgodnie z instrukcjami obsługi ESRI KB, do których link znajduje się w poście Brada, aby działał.

Ostatecznie kluczem do domyślnej edycji skryptów Python ArcGIS w Pyscripter była edycja „akcji” systemowej dla „zarejestrowanych typów plików” kończących się na pliki * .py (krok # 4). Utworzyłem nowy typ akcji „Edytuj”, a następnie podałem ścieżkę Pyscripter.exe. Gdy to zrobiłem, domyślną akcją edycji była konfiguracja uruchamiania Pyscriptera zamiast IDLE.

Ciąg, którego użyłem (ponieważ został obcięty w oknie dialogowym pokazanym poniżej) to:

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

wprowadź opis zdjęcia tutaj

RyanDalton
źródło
1
+1 za odpowiedź i jeszcze raz, gdybym mógł, za dołączenie ciągu, a nie tylko obrazu (tekst jest o wiele łatwiejszy do skopiowania i wklejenia!).
matt wilkie
7

Nie wiem, jak to będzie działać z Arcpy, ale możesz wypróbować pdb :

import pdb; pdb.set_trace()
nw1
źródło
istnieje podobna funkcjonalność dla pydev z zaćmieniem, które zostało opisane tutaj. Ustawiasz eclipse na nasłuchiwanie sygnału i możesz go uruchomić w kodzie działającym całkowicie poza eclipse przez wywołanie funkcji pydevd.settrace (). urbansim.org/Documentation/DebuggingWithEclipse
ako
0

Najprostszym sposobem, w jaki znalazłem sposób debugowania mojego kodu, jest na stałe zakodować moje dane wejściowe do ścieżki pliku istniejącego zestawu danych. Na przykład:

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"

Oprócz okna wyników, okno Pythona dostarcza pomocnych komunikatów o błędach i / lub umożliwia testowanie fragmentów kodu.

Każde dobre IDE ma sondę debugującą, która będzie miała w pamięci całe przetwarzanie do bieżącego punktu przerwania. Dzięki temu możesz zobaczyć, co dzieje się z danymi. Ustaw punkty przerwania, w których chcesz wstrzymać skrypt. Użyj warunkowych punktów przerwania, jeśli chcesz zatrzymać pętlę przy określonej iteracji. Poznaj również swoje wersje Arc i jakie funkcje są dostępne dla tych wersji.

gisdude
źródło