ฉันโพสต์คำถามเมื่อสัปดาห์ที่แล้วเกี่ยวกับการปรับแต่งคลาส ToolValidator และได้รับคำตอบที่ดีมาก ในการทำงานกับโซลูชันที่เสนอฉันได้สร้างโมดูลแบบกำหนดเองที่ดำเนินการเคียวรีบน db และจะถูกเรียกโดยทั้งชั้น ToolValidator (เพื่อให้ค่าสำหรับรายการดรอปดาวน์) และภายหลังในสคริปต์การประมวลผลทางภูมิศาสตร์ (เพื่อรับอื่น ๆ พารามิเตอร์ตามรายการที่เลือกในรายการแบบหล่นลง) อย่างไรก็ตามฉันไม่สามารถเรียกโมดูลที่กำหนดเองได้ในคลาส ToolValidator ฉันพยายามที่จะผนวกกับเส้นทางโดยไม่มีโชค เมื่อฉันพยายามใช้การเปลี่ยนแปลงเหล่านี้กับสคริปต์ฉันได้รับข้อผิดพลาดรันไทม์: [Errno 9] ตัวอธิบายไฟล์ไม่ถูกต้อง ถ้าฉันใส่ความคิดเห็นออกสายนำเข้าจะไม่มีข้อผิดพลาด
sys.path.append('my_custom_module_directory')
import my_custom_module
พวกคุณหลายคนอาจถามว่าทำไมฉันไม่ใช้เครื่องมือที่กำหนดเองกับ ArcObjects เหตุผลก็คือผู้ใช้ของฉันไม่มีสิทธิ์ที่จำเป็นในการลงทะเบียน DLLs ใด ๆ บนคอมพิวเตอร์ของพวกเขา
UPDATE: สิ่งนี้เกิดขึ้นกับฉันใน ArcGIS 10 น่าสนใจพอฉันเริ่มผนวกเส้นทางภายในฟังก์ชัน initialiazeParameters ของคลาส ToolValidator ถ้าฉันผนวกส่วนนอก (เช่นด้านบน) ของคลาส ToolValidator ทุกอย่างจะทำงานอย่างที่คาดไว้
sys.path.append('C:/Working/SomeFolder')
import somescript -------->THIS WORKS
class ToolValidator:
"""Class for validating a tool's parameter values and controlling
the behavior of the tool's dialog."""
def __init__(self):
"""Setup arcpy and the list of tool parameters."""
import arcpy
sys.path.append('C:/Working/SomeFolder')
import somescript -------> THIS DOESNT WORK
self.params = arcpy.GetParameterInfo()
ปรับปรุง 2: ฉันคิดว่าฉันพบสาเหตุที่แท้จริงของปัญหาของฉัน ในตัวอย่างโค้ดในโพสต์นี้ฉันได้ผนวกสิ่งที่ปรากฏเป็นเส้นทางจริง (เช่น C: / Working / SomeFolder) ไปยัง sys.path ในชั้น ToolValidator จริงของฉันฉันกำลังสร้างเส้นทางสัมพัทธ์โดยใช้os.path.dirname(__file__)
+ "\ my_special_folder ... " ฉันคาดหวังว่าos.path.dirname(__file__)
จะคืนค่าพา ธ ของกล่องเครื่องมือเนื่องจากประกอบด้วย ToolValidator class ฉันมาเพื่อหาสิ่งนี้ไม่ใช่กรณี เท่าที่ฉันสามารถบอกได้คลาส ToolValidator ไม่เคยเขียนไปยังไฟล์. py และฉันคาดเดารหัสนี้จะถูกส่งผ่านไปยังตัวแปลภาษาไพ ธ อนในหน่วยความจำดังนั้นจึง__file__
ไม่มีประโยชน์หรือสคริปต์ temp บางส่วนยังคงอยู่และ execfile ( path_to_script) ถูกเรียกอีกครั้งแสดงผล__file__
ไร้ประโยชน์ ฉันแน่ใจว่ามีเหตุผลอื่นที่ฉันขาดหายไปเช่นกัน
เรื่องสั้นสั้นถ้าฉันใช้เส้นทาง hardcoded, sys.append ทำงานได้ทุกที่, เส้นทางสัมพัทธ์ทำงานได้ไม่ดีในคลาส ToolValidator