2014-07-21 12 views
7

मुझे पता है कि अगर मैं नाम import(moduleName) द्वारा एक मॉड्यूल आयात करते हैं, तो मैं इसे reload(moduleName)पायथन: उस के साथ *

साथ पुनः लोड कर सकते आयात किया गया है मॉड्यूल को फिर से लोड लेकिन करने के लिए कैसे, मैं मॉड्यूल का एक समूह एक क्लीन साथ आयात करने कर रहा हूँ स्टार:

from proj import * 

मैं इस मामले में उन्हें कैसे पुनः लोड कर सकता हूं?

+9

एक और कारण तारांकित आयात का उपयोग नहीं है यही कारण है कि। – vaultah

+0

शायद आप sys मॉड्यूल के साथ कोशिश कर सकते हैं। लोड किए गए सभी मॉड्यूल सूचीबद्ध करें (sys.moduled.keys()) और फिर उन पर आयात निष्पादित करें (क्लीनअप के बाद -> sys.modules.clear()) –

+2

@vaultah: मुझे समझ में नहीं आता कि आप क्या कहने की कोशिश कर रहे हैं। वह तारांकित आयात खराब विचार है इसलिए यही कारण है कि पाइथन आपको उन तारांकित आयातों को फिर से लोड करने का कोई तरीका नहीं देता है, भले ही पायथन पहली बार तारांकित आयात की अनुमति देता है। क्या इस विषमता के लिए एक अनिवार्य कारण है? –

उत्तर

1

मुझे लगता है कि सभी पायथन मॉड्यूल को फिर से लोड करने का एक तरीका है। पायथन 2.7 के लिए कोड नीचे सूचीबद्ध है: गणित मॉड्यूल को तारांकन के साथ आयात करने के बजाय, आप जो कुछ भी चाहते हैं उसे आयात कर सकते हैं।

from math import * 
from sys import * 

Alfa = modules.keys() 
modules.clear() 

for elem in Alfa: 
    str = 'from '+elem+' import *' 
    try:  
     exec(str)  
    except: 
     pass 
+1

उपरोक्त क्योंकि यह काम करता है और यह केवल कुछ पंक्तियां हैं, लेकिन मैं नहीं कह सकता कि यह * प्रश्न का उत्तर है। मान लें कि मैं अपने प्रोजेक्ट को खोल में परीक्षण कर रहा हूं, इसलिए मैं "प्रोज आयात * से" करता हूं, और अब मैं प्रोजे के मॉड्यूल में से किसी एक में कुछ ठीक करता हूं और मैं पुनः लोड करना चाहता हूं। मुझे ऐसा करने के लिए एक विशेष समारोह लिखना चाहिए? जब मैं नाम से मॉड्यूल आयात करता हूं, तो मुझे केवल उस मॉड्यूल पर पुनः लोड() को कॉल करना होगा। पायथन तारांकित आयात की अनुमति देता है लेकिन उन तारांकित आयात मॉड्यूल को फिर से लोड नहीं करता है? –

0

यह एक जटिल और भ्रमित मुद्दा है। मैं जो विधि देता हूं वह मॉड्यूल को फिर से लोड करेगा और दिए गए संदर्भ में चर को रीफ्रेश करेगा। हालांकि, यदि आपके पास दिए गए मॉड्यूल पर तारांकित आयात का उपयोग करके एकाधिक मॉड्यूल हैं तो यह विधि खत्म हो जाएगी क्योंकि वे अपडेट करने के बजाय अपने मूल मान बनाए रखेंगे। आम तौर पर, एक मॉड्यूल को फिर से लोड करने के लिए भी एक ऐसा कुछ है जो आपको आरईपीएल के साथ काम करने के अपवाद के साथ नहीं करना चाहिए। मॉड्यूल कुछ ऐसा नहीं है जो गतिशील होना चाहिए। आपको आवश्यक अपडेट प्रदान करने के अन्य तरीकों पर विचार करना चाहिए।

import sys 

def reload_starred(module_name, context): 
    if context in sys.modules: 
     context = vars(sys.modules[context]) 
    module = sys.modules[module_name] 

    for name in get_public_module_variables(module): 
     try: 
      del context[name] 
     except KeyError: 
      pass 

    module = reload(module) 

    context.update(get_public_module_variables(module)) 

def get_public_module_variables(module): 
    if hasattr(module, "__all__"): 
     return dict((k,v) for (k,v) in vars(module).items() 
       if k in module.__all__) 
    else: 
     return dict((k,v) for (k,v) in vars(module).items() 
       if not k.startswith("_")) 

उपयोग:

reload_starred("my_module", __name__) 
reload_starred("my_module", globals()) 
reload_starred("my_module", "another_module") 
def function(): 
    from my_module import * 
    ... 
    reload_starred("my_module", locals()) 
संबंधित मुद्दे