मैंने पिछले हफ्ते एक टूलविलेडेटर वर्ग को अनुकूलित करने के बारे में एक प्रश्न पोस्ट किया था और कुछ बहुत अच्छे उत्तर मिले। प्रस्तावित समाधानों के साथ काम करने में, मैंने एक कस्टम मॉड्यूल बनाया है जो db पर क्वेरीज़ निष्पादित करता है, और टूलविलेजिएटर क्लास (ड्रॉप-डाउन सूचियों के लिए मान प्रदान करने के लिए) और बाद में जियोप्रोसेसिंग स्क्रिप्ट (अन्य को प्राप्त करने के लिए) दोनों द्वारा कॉल किया जाएगा। ड्रॉप-डाउन सूचियों में चयनित वस्तुओं पर आधारित पैरामीटर)। हालाँकि, मैं वास्तव में ToolValidator वर्ग में कस्टम मॉड्यूल को कॉल नहीं कर सकता। मैं बिना किसी भाग्य के साथ जुड़ने की कोशिश कर रहा हूं। जब मैं इन परिवर्तनों को स्क्रिप्ट में लागू करने का प्रयास करता हूं, तो मुझे एक रनटाइम त्रुटि मिलती है: [इरनो 9] खराब फ़ाइल विवरणक। अगर मैं आयात लाइन पर टिप्पणी करता हूं, तो कोई त्रुटि नहीं है।
sys.path.append('my_custom_module_directory')
import my_custom_module
आप में से कई लोग पूछ सकते हैं कि मैं सिर्फ आर्कओबजेक्ट्स के साथ एक कस्टम टूल क्यों लागू नहीं करता। इसका कारण यह है कि मेरे अंतिम उपयोगकर्ताओं के पास अपने कंप्यूटर पर किसी भी dll को पंजीकृत करने के लिए निजी कॉलेज नहीं हैं।
अद्यतन: यह मेरे लिए आर्कजीआईएस 10 में हो रहा था। दिलचस्प बात यह है कि, मैं शुरू में टूलविलेगेटर वर्ग के इनिशियजपैरमीटर्स फ़ंक्शन के अंदर पथ से जुड़ रहा था। यदि मैं 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: मुझे लगता है कि मैंने अपनी समस्या का सही कारण पाया। इस पोस्ट में कोड स्निपेट्स में, मैं यह अपील कर रहा हूं कि sys.path को वास्तविक पथ (ex C: / Working / SomeFolder) दिखाई दें। मेरे वास्तविक ToolValidator वर्ग में, मैं os.path.dirname(__file__)
+ \ "my_special_folder ..." का उपयोग करके एक सापेक्ष पथ का निर्माण कर रहा था । मैं अनुमान लगा रहा था कि os.path.dirname(__file__)
टूलबॉक्स का मार्ग वापस आ जाएगा, क्योंकि इसमें टूलविलेडेटर वर्ग शामिल है। मुझे पता चला है कि यह मामला नहीं है। जहाँ तक मैं बता सकता हूँ, टूलविलेडेटर वर्ग वास्तव में एक .py फ़ाइल में कभी नहीं लिखा जाता है, और मैं कल्पना करता हूं कि यह कोड स्मृति में अजगर दुभाषिया के लिए पारित किया गया है, इसलिए __file__
बेकार है, या कुछ अस्थायी स्क्रिप्ट कायम है और फिर निष्पादन योग्य है ( path_to_script) कहा जाता है, फिर से प्रतिपादन__file__
निकम्मा। मुझे यकीन है कि अन्य कारण भी हैं जो मुझे याद आ रहे हैं।
लंबी कहानी छोटी, अगर मैं एक हार्डकोड मार्ग का उपयोग करता हूं, तो sys.append कहीं भी काम करता है, रिश्तेदार पथ टूलविलेलेटर वर्ग में इतनी अच्छी तरह से काम नहीं करते हैं।