การดีบักสคริปต์ ArcPy หรือไม่


50

ฉันได้เขียนสคริปต์หลามหลาย ArcPy ใช้ใน ArcGIS 10 และจนถึงขณะนี้หมายถึงเฉพาะการแก้จุดบกพร่องของฉันจะมีการ จำกัด การพิมพ์ข้อความไปที่หน้าต่างผล Geoprocessing arcpy.AddMessage()โดยใช้

มีตัวเลือกอื่น ๆ เช่นการตั้งค่าจุดพักหรือไม่

วิธีการของเจสันนั้นใช้งานได้ดี หากคุณมีข้อผิดพลาดในกล่องเครื่องมือของคุณเช่นการตรวจสอบความถูกต้อง IDE ของคุณอาจไม่สามารถระบุปัญหาได้เนื่องจากกล่องเครื่องมือถูกเข้ารหัส อย่างน้อยปีกไม่สามารถระบุได้


อาจเป็นตัวเลือกที่นี่? code google pyscripter
Brad Nesom

The ArcGIS ช่วยพูดถึงวิธีใช้ดีบักเกอร์ใน PythonWin
Regan Sarwas

ในคุณสมบัติไฟล์ OS คุณได้ลองตั้งค่าโปรแกรมเริ่มต้นสำหรับไฟล์. py เป็น PyScripter หรือไม่
KiloGeo

ด้วยการทำเช่นนี้ฉันจะไม่บอกระบบปฏิบัติการอย่างมีประสิทธิภาพว่าฉันไม่ต้องการเรียกใช้สคริปต์ไพ ธ อนของฉัน แต่ควรเปิดในตัวแก้ไขใช่ไหม
RyanDalton

ใช่ถูกต้อง. ขออภัยฉันเข้าใจผิดวัตถุประสงค์ของคุณ
KiloGeo

คำตอบ:


37

โดยทั่วไปแล้ว Python debuggers / IDE จะสมมติว่าสคริปต์ Python กำลังทำงานในกระบวนการเดียวกับตัวเองดังนั้นการดีบักสคริปต์ที่ทำงานใน ArcMap.exe นั้นถูกต้อง - คุณต้องทำให้ GP ของสภาพแวดล้อมการเขียนสคริปต์เพียงพอในสคริปต์ Python ในขณะที่คุณสามารถ แก้ไขข้อบกพร่องด้วย

วิธีการที่ใช้งานได้ดีสำหรับฉันในช่วงไม่กี่ปีที่ผ่านมาคือการเขียนสคริปต์ง่าย ๆ ที่เพิ่งเรียกเครื่องมือและใช้เป็นสคริปต์หลักของฉันใน Python IDE (Wing หรือ Pythonwin) และตั้งจุดพักของฉันไว้ใน. py ของเครื่องมือ ไฟล์ยังเปิดในเซสชัน IDE เดียวกัน

ดังนั้นโดยทั่วไปฉันทำสิ่งนี้:

  1. รับชุดอินพุตที่ไม่ทำงานในเครื่องมือสคริปต์ของฉัน
  2. เปิดไฟล์. py อย่างง่ายในโฟลเดอร์เดียวกับ. tbx ที่เรียกใช้เครื่องมือ
  3. เปิดสคริปต์ผู้โทรและไฟล์สคริปต์. py ใน IDE
  4. ตั้งจุดพักในไฟล์เครื่องมือสคริปต์
  5. รันสคริปต์ผู้โทร

และสคริปต์ผู้โทรของฉันก็ค่อนข้างง่าย:

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

ฉันลองwinpdbเพื่อดีบักสคริปต์ที่ทำงานใน ArcMap แต่ฉันไม่เคยโชคดี หากคุณต้องการที่จะลองและทำให้มันใช้งานได้ดีโปรดแบ่งปันสิ่งที่คุณพบ


1
ทางออกที่ดี! ฉันจะลอง
George Silva

ฉันใช้ winpdb สำเร็จแล้วในอดีตเพื่อดีบักสคริปต์แบบยาว winpdb เมื่อตั้งค่าแล้วให้คุณ "ข้ามไปที่" สคริปต์แบบสแตนด์อโลนที่รันอยู่ในปัจจุบันหรือในทางทฤษฎีหนึ่งในกระบวนการอื่นเช่น ArcMap และแก้ปัญหาตามปกติ สิ่งนี้มีประโยชน์มากสำหรับการเช็คอินสคริปต์ที่ใช้เวลานานหลายสัปดาห์กว่าจะเสร็จสมบูรณ์ ฉันยังไม่ได้ลองดีบัก arcpy ภายในกระบวนการสมัคร ArcGIS
blah238

ฉันแนะนำ PyCharm มันใช้งานได้เหมือนเวทมนตร์
user39901230

26

คุณสามารถเปลี่ยนได้จากกล่องโต้ตอบตัวเลือก GP เพียงชี้ไปที่ตัวเลือกที่สามารถใช้งานได้ของคุณสำหรับเครื่องมือแก้ไข / ดีบักเกอร์

กล่องโต้ตอบการตั้งค่า GP


ดูเหมือนว่าจะเป็นการปรับปรุงใหม่สำหรับ ArcGIS 10 ใช่ไหม? ฉันไม่เห็นตัวเลือกการตั้งค่านี้สำหรับ 9.3
RyanDalton

ถูกต้องใหม่ใน 10
Jason Scheirer

9

สำหรับผู้ใช้งาน 10 คนเห็นได้ชัดว่าเส้นทางที่ดีที่สุดที่จะไปคือโพสต์ของ Jason ซึ่งฉันทำเครื่องหมายเป็น "คำตอบที่ดีที่สุด" สำหรับผู้ใช้ 9.3 ฉันสามารถทำตามคำแนะนำการสนับสนุน ESRI KB ที่ลิงก์ในโพสต์ของแบรดเพื่อให้มันทำงานได้

ในที่สุดกุญแจสำคัญในการเริ่มต้นการแก้ไขสคริปต์หลาม ArcGIS ใน Pyscripter คือการแก้ไขระบบ "การกระทำ" สำหรับ "ประเภทไฟล์ที่ลงทะเบียน" ซึ่งลงท้ายด้วยไฟล์ * .py (ขั้นตอนที่ 4) ฉันสร้างประเภทการกระทำ "แก้ไข" ใหม่แล้วรวมเส้นทาง Pyscripter.exe เมื่อฉันทำสิ่งนี้แล้วการแก้ไขเริ่มต้นจะถูกตั้งค่าให้เรียกใช้ Pyscripter แทนที่จะเป็น IDLE

สตริงที่ฉันใช้ (เพราะมันถูกตัดออกในกล่องโต้ตอบที่แสดงด้านล่าง) คือ:

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

ป้อนคำอธิบายรูปภาพที่นี่


1
+1 สำหรับคำตอบและอีกครั้งถ้าทำได้เพื่อรวมสตริงและไม่ใช่แค่รูปภาพ (ข้อความง่ายกว่ามากในการคัดลอกและวาง!)
matt wilkie

7

ฉันไม่รู้ว่ามันจะทำงานกับ arcpy ได้อย่างไร แต่คุณสามารถลองpdb :

import pdb; pdb.set_trace()

มีฟังก์ชันการทำงานที่คล้ายกันสำหรับ pydev ด้วย eclipse ซึ่งอธิบายไว้ที่นี่ คุณตั้งค่า eclipse เพื่อฟังสัญญาณและคุณสามารถทริกเกอร์ในโค้ดที่รันภายนอก eclipse โดยการเรียกใช้ฟังก์ชัน pydevd.settrace () urbansim.org/Documentation/DebuggingWithEclipse
ako

0

วิธีที่ตรงไปตรงมาที่สุดที่ฉันพบว่าการดีบักรหัสของฉันคือการใส่รหัสของฉันลงในพา ธ ไฟล์ของชุดข้อมูลที่มีอยู่ ตัวอย่างเช่น:

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"

นอกจากหน้าต่างผลลัพธ์แล้วหน้าต่างไพ ธ อนยังให้ข้อความแสดงข้อผิดพลาดที่เป็นประโยชน์และ / หรือให้คุณทดสอบตัวอย่างโค้ด

IDE ที่ดีใด ๆ มีโพรบดีบั๊กที่จะมีการประมวลผลทั้งหมดของคุณจนถึงจุดพักปัจจุบัน ด้วยสิ่งนี้คุณสามารถเห็นสิ่งที่เกิดขึ้นกับข้อมูล กำหนดจุดพักที่คุณต้องการหยุดสคริปต์ชั่วคราว ใช้เบรกพอยต์แบบมีเงื่อนไขหากคุณต้องการหยุดการวนซ้ำที่การวนซ้ำที่เฉพาะเจาะจง ยังรู้รุ่นอาร์คของคุณและฟังก์ชั่นใดบ้างที่มีให้ในเวอร์ชันนั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.