Script ArcPy debugging?

50

Saya telah menulis banyak skrip Python menggunakan ArcPy di ​​ArcGIS 10, dan sejauh ini satu-satunya cara debugging saya dibatasi untuk mencetak pesan ke jendela hasil geoprosesing menggunakan arcpy.AddMessage().

Apakah ada opsi lain di luar sana, seperti mengatur break point?

Metode Jason bekerja dengan baik. Jika Anda memiliki bug di kotak alat Anda, seperti validasi, IDE Anda mungkin tidak akan dapat menentukan masalah karena kotak alat dikodekan. Setidaknya WING tidak dapat menentukannya.

Penyamak
sumber
Mungkin ada opsi di sini? kode google pyscripter
Brad Nesom
The ArcGIS bantuan membahas bagaimana menggunakan debugger di PythonWin
Regan Sarwas
Di properti file OS, sudahkah Anda mencoba mengatur program default untuk file .py ke PyScripter?
KiloGeo
Dengan melakukan ini, bukankah saya akan secara efektif memberi tahu OS bahwa saya tidak ingin menjalankan skrip python saya, tetapi hanya membukanya di editor?
RyanDalton
Ya benar. Maaf saya salah mengerti tujuan Anda.
KiloGeo

Jawaban:

37

Biasanya Python debuggers / IDEs menganggap skrip Python berjalan dalam proses yang sama seperti itu sehingga debugging skrip yang berjalan di ArcMap.exe benar - Anda perlu mendapatkan cukup lingkungan skrip GP yang di-boot dalam skrip Python yang Anda bisa untuk debug dengan.

Metode yang bekerja sangat baik bagi saya selama beberapa tahun terakhir adalah menulis skrip sederhana yang hanya memanggil alat dan menggunakannya sebagai skrip utama saya di Python IDE (Wing atau Pythonwin) dan mengatur breakpoints saya di .py tool .py file juga terbuka di sesi IDE yang sama.

Jadi pada dasarnya saya melakukan ini:

  1. Dapatkan set input yang tidak berfungsi di alat skrip saya
  2. Buka file .py sederhana di folder yang sama dengan .tbx yang memanggil alat
  3. Buka skrip pemanggil dan file skrip alat .py di IDE
  4. Atur breakpoint dalam file alat skrip
  5. Jalankan skrip penelepon

Dan skrip penelepon saya biasanya cukup sederhana:

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

Saya sudah mencoba winpdb untuk men-debug skrip yang berjalan di ArcMap tetapi saya tidak pernah beruntung. Jika Anda ingin mencobanya dan Anda membuatnya bekerja dengan baik, silakan bagikan temuan Anda.

Jason Scheirer
sumber
1
solusi bagus! saya akan mencobanya.
George Silva
Saya telah menggunakan winpdb dengan sukses di masa lalu untuk men-debug skrip proses panjang. winpdb, sekali pengaturan memungkinkan Anda untuk "melompat ke" skrip mandiri yang sedang berjalan atau secara teoritis dalam proses lain seperti ArcMap dan debug secara normal. Ini sangat berguna untuk memeriksa naskah yang membutuhkan waktu berminggu-minggu untuk selesai. Saya belum mencoba men-debug arcpy dalam proses aplikasi ArcGIS.
blah238
Saya akan merekomendasikan PyCharm. itu bekerja seperti sulap
user39901230
26

Anda dapat mengubahnya dari dialog opsi GP, cukup arahkan ke executable of choice Anda untuk editor / debugger.

Dialog Pengaturan GP

Jason Scheirer
sumber
Ini terlihat sebagai peningkatan baru untuk ArcGIS 10, benar? Saya tidak melihat opsi pengaturan ini untuk 9.3.
RyanDalton
Benar, baru jam 10.
Jason Scheirer
9

Untuk pengguna 10, jelas rute terbaik untuk pergi adalah dengan posting Jason, yang saya tandai sebagai "jawaban terbaik". Untuk pengguna 9.3, saya bisa mengikuti petunjuk Dukungan KB ESRI yang ditautkan di pos Brad agar berfungsi.

Pada akhirnya kunci untuk mendapatkan pengeditan default skrip python ArcGIS di Pyscripter adalah mengedit sistem "action" untuk "jenis file terdaftar" yang diakhiri dengan file * .py (langkah # 4). Saya membuat tipe tindakan "Edit" baru dan kemudian memasukkan jalur Pyscripter.exe. Setelah saya melakukan ini, tindakan edit default disiapkan untuk meluncurkan Pyscripter, bukan IDLE.

String yang saya gunakan (karena terpotong di kotak dialog yang ditunjukkan di bawah) adalah:

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

masukkan deskripsi gambar di sini

Ryan Dalton
sumber
1
Memberi +1 untuk jawabannya, dan sekali lagi, jika saya bisa, untuk memasukkan string dan bukan hanya gambar (teks jauh lebih mudah untuk disalin dan ditempelkan!).
matt wilkie
7

Saya tidak tahu bagaimana ini akan bekerja dengan arcpy, tetapi Anda dapat mencoba pdb :

import pdb; pdb.set_trace()
nw1
sumber
ada fungsi yang sama untuk pydev dengan eclipse, yang dijelaskan di sini. Anda mengatur gerhana untuk mendengarkan sinyal, dan Anda dapat memicu itu dalam kode yang sepenuhnya berjalan di luar gerhana oleh panggilan fungsi pydevd.settrace (). urbansim.org/Documentation/DebuggingWithEclipse
ako
0

Cara paling lurus ke depan yang saya temukan untuk men-debug kode saya adalah dengan mengkodekan input saya ke jalur file dataset yang sudah ada. Sebagai contoh:

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"

Selain jendela hasil, jendela python menghasilkan pesan kesalahan yang bermanfaat dan / atau memungkinkan Anda untuk menguji potongan kode.

Setiap IDE yang baik memiliki probe debug yang akan memiliki, dalam memori, semua pemrosesan Anda hingga breakpoint saat ini. Dengan itu, Anda dapat melihat apa yang terjadi dengan data. Tetapkan breakpoint di tempat Anda ingin menjeda skrip. Gunakan breakpoint bersyarat jika Anda ingin menghentikan loop pada iterasi tertentu. Juga, ketahui versi Arc Anda dan fungsi apa yang tersedia untuk versi tersebut.

gisdude
sumber