ArcGIS पायथन टूलबॉक्स में आयातित मॉड्यूल को ताज़ा करना?


15

ArcMap में एक पायथन टूलबॉक्स (.pyt) का उपयोग करते समय, मैं आमतौर पर एक पैटर्न का पालन करता हूं, जहां .pyt फ़ाइल खुद इनपुट तर्कों को इकट्ठा करने और स्वयं को परिभाषित करने के लिए एक आवरण है। सपोर्टिंग कोड अलग यूनिट-टेस्टेबल मॉड्यूल में रखा जाता है।

उदाहरण:

import supporting_module

class MyTool(object):

    ...

    def execute(self, parameters, messages):
        """The source code of the tool."""
        some_input = parameters[0].valueAsText
        some_output = parameters[1].valueAsText

        supporting_module.do_something(some_input, some_output)
        arcpy.SetParameter(2, some_output)

यह वास्तव में अच्छी तरह से काम करता है, लेकिन मैं विकास के दौरान एक निराशाजनक मुद्दे में चला गया हूं। राइट-क्लिक करें -> आर्केप में .pyt पर ताज़ा करें। केवल .pyt फ़ाइल के कोड को ताज़ा करता है। यह आयातित मॉड्यूल्स को रिफ्रेश नहीं करता है, इसलिए जब भी मैं वहां कुछ बदलता हूं, मुझे आर्कप्स को बंद करना और फिर से खोलना होगा। सौभाग्य से, चूंकि मैं स्वतंत्र रूप से कोड का परीक्षण कर रहा हूं, इसलिए मुझे यह एक टन करने की जरूरत नहीं है, लेकिन यह अभी भी एक बड़ी परेशानी है। क्या इसके आसपास कोई रास्ता है? कुछ हद तक संबंधित - क्या पायथन कंसोल को पूरी तरह से रीफ्रेश करने का कोई तरीका है (मेरे पास एक कस्टम साइट-पैकेज है जिसे मुझे आर्कबप्स को भी बंद करना चाहिए या साथ ही परिवर्तनों से खींचने के लिए फिर से खोलना चाहिए)?

मैं ArcMap 10.2.1 का उपयोग कर रहा हूं।

जवाबों:


14

मुझे यह संभावना मिली, /programming/1517038/python-refresh-reload

एक चेतावनी यह है कि यदि आपके पास कोई चर मॉड्यूल को सौंपा गया है, तो उन्हें फिर से असाइन करने की आवश्यकता होगी।

लेकिन जैसा कि आपने ऊपर लिखा है, आप ऐसा कर सकते हैं:

import supporting_module
def execute()
  reload(supporting_module)
  ...

इस तरह से हर बार जब आप उपकरण को चलाते हैं तो आपको अपडेट किया गया मॉड्यूल सुनिश्चित होगा। एक बार विकास हो जाने के बाद, इसे बाहर निकाला जा सकता है।


1
बेहद मददगार और यह मेरे द्वारा पोस्ट किए गए सरल उदाहरण को हल करता है। हालाँकि, अगर support_module अन्य सहायक मॉड्यूल को भी आयात करता है, तो उन्हें पुनः लोड के साथ भी कॉल करना होगा। मैं सोच रहा हूं कि यह सबसे अच्छा है, क्योंकि यह जिस तरह से पायथन लोड मॉड्यूल के साथ समझ में आता है - मैं आपको इस जवाब के रूप में चिह्नित करूंगा कि अगर अगले दिन ऐसा नहीं होता है।
जोश वार्ट्स

बहुत मददगार। मैंने पाया है कि reload()टूलबॉक्स की PYT फ़ाइल के शीर्ष पर सहायक मॉड्यूल को आयात करने के बाद ही कॉल करना पर्याप्त है । इस प्रकार, यदि टूलबॉक्स में कई उपकरण हैं, तो मुझे प्रत्येक टूल के execute()फ़ंक्शन में रीलोड को डुप्लिकेट करने की आवश्यकता नहीं है ।
माइक फिंच

मुझे वास्तव में समझ में नहीं आता है कि यह एवियर्स समस्या को कैसे हल करता है। मेरे पास .py फ़ाइलों में मेरे उपकरण संग्रहीत हैं और मैं उनका उपयोग करके आयात करता हूं from pyfile import Tool, reload(tool)रिटर्न जोड़ता हूं typeError: reload() argument must be module। कोई विचार?
रत्‍नीलिल

2
मैंने हल खोज लिया! मॉड्यूल के रूप में पाई-फाइल को पहले आयात करें, फिर से लोड करें और फिर मॉड्यूल के भीतर वर्ग को आयात करें। देखें: stackoverflow.com/a/6946467/4139249
Ratnanil

5

यहां पहले से सुझाए गए तरीके से एक अलग और अधिक मजबूत तरीका है।

मैंने स्वयं इस मॉड्यूल का उपयोग नहीं किया है, लेकिन मुझे लगता है कि यह आपकी समस्या का समाधान करेगा:

पायथन मॉड्यूल रीलोडर

यह पुस्तकालय पायथन के लिए एक निर्भरता-आधारित मॉड्यूल पुनः लोड करता है। बिलिन रीलोड () फ़ंक्शन के विपरीत, यह रीलोडर अनुरोधित मॉड्यूल और उस मॉड्यूल पर निर्भर अन्य सभी मॉड्यूल को फिर से लोड करेगा।

पिछले उदाहरण को देखते हुए, यह सभी आश्रितों को एक कॉल के साथ लोड करना चाहिए:

import reloader
reloader.enable()

import supporting_module

def execute()
  reloader.reload(supporting_module)
  ...

यह पहली बार है जब मैंने इस मॉड्यूल को देखा है, इसलिए यदि आप इसे अपने टूल में लागू करते हैं, तो इस पर टिप्पणी करें कि यह आपके लिए कितना अच्छा है।


अच्छा खोजो! अगर आपने जैसा दिखाया वैसा ही जोड़ा तो यह काम कर गया। यदि केवल .pyt फ़ाइल ही बदल जाए तो मुझे टूलबॉक्स पर राइट-क्लिक करना होगा। सहायक मॉड्यूल और उनके उप मॉड्यूल को सफलतापूर्वक लोड किया जा रहा है। हालांकि, एक कैविएट - मुझे मौके पर एक युगल के अपवाद और एक आर्कपॉपर दुर्घटना के बारे में कुछ पता नहीं चला (हालांकि आर्कपॅम क्रैश वास्तव में असामान्य नहीं है, दुर्भाग्य से)। नोट - मैंने केवल सहायक मॉड्यूल और एक आश्रित उप-मॉड्यूल के साथ इसका परीक्षण किया है। भविष्य में स्थिरता पर रिपोर्ट कर सकते हैं।
जोश वॉट्स

1
सुपर, वापस रिपोर्टिंग के लिए धन्यवाद। हाँ, आर्कपैक चलाते समय, मुझे कभी-कभी क्रैश टेस्ट डमी की तरह महसूस होता है।
cndnflyr

दुर्भाग्य से, मैंने इस रीलोडर के साथ बहुत अधिक स्थिरता के मुद्दों को चलाया है, इसलिए मैंने चयनित उत्तर को मूल लोड () में निर्मित फ़ंक्शन में बदल दिया है। कभी-कभी सरल बेहतर होता है!
जोश वार्ट्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.