NameError देने वाले Reloading मॉड्यूल: नाम 'पुनः लोड' परिभाषित नहीं है


162

मैं एक ऐसे मॉड्यूल को फिर से लोड करने की कोशिश कर रहा हूं जो मैंने पहले ही पायथन 3 में आयात किया है। मुझे पता है कि आपको केवल एक बार आयात करने की आवश्यकता है और importकमांड को फिर से निष्पादित करने से कुछ भी नहीं होगा।

निष्पादन reload(foo)यह त्रुटि दे रहा है:

Traceback (most recent call last):
    File "(stdin)", line 1, in (module)
    ...
NameError: name 'reload' is not defined

त्रुटि का क्या अर्थ है?

जवाबों:


239

reload पायथन 2 में एक अंतर्निहित है, लेकिन पायथन 3 में नहीं है, इसलिए आप जो त्रुटि देख रहे हैं वह अपेक्षित है।

यदि आप वास्तव में पायथन 3 में एक मॉड्यूल को फिर से लोड करना चाहते हैं, तो आपको इसका उपयोग करना चाहिए:

  • importlib.reload पायथन 3.4 और उससे अधिक के लिए
  • imp.reloadपायथन 3.0 से 3.3 के लिए (पायथन 3.4 के बाद से पदावनत importlib)

37
यह उत्तर यह ध्वनि देता है जैसे कि पायथन 3 में एक मॉड्यूल को फिर से लोड करना बुरा है। इसके पीछे क्या सोच है?
एबीएम

11
रिलोड करना हमेशा समस्याग्रस्त होता है। मॉड्यूल चर को पुन: लोड कर रहा है, लेकिन पुराने को नहीं हटाता है, इसलिए यदि आप कुछ नाम बदलते हैं तो पुराना नाम अभी भी मौजूद रहेगा। यदि आप कक्षा की परिभाषा बदलते हैं, तो मौजूदा वस्तुओं में अभी भी पुराने प्रकार होंगे। अंत में, कुछ मॉड्यूल आयात समय पर कोड चलाते हैं जिन्हें दो बार चलाने के लिए डिज़ाइन नहीं किया गया है। इसलिए रीलोडिंग से बचना बेहतर है, लेकिन अक्सर बहुत सुविधाजनक है।
इवान

13
मैं कहूंगा कि यह अक्सर समस्याग्रस्त है, लेकिन हमेशा नहीं । यह सुनिश्चित करने के लिए, मुझे लगता है कि reloadएक स्क्रिप्ट में लिखने के लिए वैध उपयोग के मामले वास्तव में बहुत दुर्लभ हैं, और इस तरह के अंधेरे कला को रोजगार देने वालों को इस टिप्पणी को पढ़ने की संभावना नहीं है। हालांकि, यदि आप एक मॉड्यूल विकसित कर रहे हैं और एक IPython कंसोल का उपयोग करके इसे अंतःक्रियात्मक रूप से परीक्षण कर रहे हैं, तो reloadउस कार्य प्रवाह में काम कर सकते हैं। जैसा कि @ इवान ने कहा, हालांकि, आयात-समय के दुष्प्रभावों के लिए बाहर देखो। सामान्य तौर पर, मैं कहूंगा कि reloadकिसी और के मॉड्यूल से आईएनजी से बचें । reloadअपने खुद के डिजाइन समय के दौरान समझ में आता है।
टिम डी

6
मैं अपने काम के लिए Jupyter नोटबुक का उपयोग करता हूं, और चीजों को चुस्त-दुरुस्त रखने के लिए, मैं ऐसे काम करता हूं जिनमें आयात पैकेज में न्यूनतम संशोधन की आवश्यकता होती है। हालाँकि, उन चीजों को कभी-कभी संशोधन की आवश्यकता होती है, और पुनः लोड करना बिल्कुल सही काम है, क्योंकि मेरी नोटबुक कर्नेल मेमोरी गणना में पकड़ रही है, जो कि, शाब्दिक रूप से गणना करने के लिए पूरे दिन लिया गया है।
स्कॉट

डेटाबेस कार्यों जैसे समय लेने वाली कॉल के साथ पुस्तकालयों के सक्रिय विकास के लिए पुनः लोड करना महत्वपूर्ण है। हालांकि, मुख्य मुद्दों में से एक जिसे आप पुनः लोड करने वाले मॉड्यूल में सामना कर सकते हैं, वह यह है कि सज्जाकार के साथ कार्य यहाँ
अलेक्जेंडर मैकफर्लेन

82

के लिए> = पायथन 3.4:

import importlib
importlib.reload(module)

<= पायथन 3.3 के लिए:

import imp
imp.reload(module)

Python2.x के लिए:

इन-बिल्ट reload()फ़ंक्शन का उपयोग करें ।

reload(module)

48
import imp
imp.reload(script4)

7
पायथन 3.4 के बाद से पदावनत - importlibइसके बजाय उपयोग करें ।
मार्क अमेरी

39

पहले लिखे गए उत्तर पर विस्तार करने के लिए, यदि आप एक एकल समाधान चाहते हैं जो पायथन संस्करणों 2 और 3 में काम करेगा, तो आप निम्नलिखित का उपयोग कर सकते हैं:

try:
    reload  # Python 2.7
except NameError:
    try:
        from importlib import reload  # Python 3.4+
    except ImportError:
        from imp import reload  # Python 3.0 - 3.3

12

मैं निम्नलिखित स्निपेट का उपयोग करने की सलाह देता हूं क्योंकि यह सभी अजगर संस्करणों में काम करता है (आवश्यकता है six):

from six.moves import reload_module
reload_module(module)

2

Python2 और python3 संगतता के लिए, आप इसका उपयोग कर सकते हैं:

# Python 2 and 3
from imp import reload
reload(mymodule)

1
यह पायथन 3.7 (और पहले) में काम करता है, लेकिन @Alex Martelli नीचे लिखा गया है। Alleo के उत्तर का उपयोग करें 'छः बजे से आयात reload_module'
चार्ल्स प्लेजर

2

यदि आप बाहरी कामों का उपयोग नहीं करना चाहते हैं, तो एक उपाय यह है कि अजगर 3 के लिए अजगर 2 से पुनः लोड विधि को फिर से बनाया जाए। मॉड्यूल के शीर्ष में इसका उपयोग करें (अजगर 3.4+ मानता है)।

import sys
if(sys.version_info.major>=3):
    def reload(MODULE):        
        import importlib
        importlib.reload(MODULE)

यदि आप पाइथन फाइलों को कॉन्फिग फाइल के रूप में इस्तेमाल करते हैं और एप्लिकेशन के रिस्टार्ट से बचना चाहते हैं तो BTW रीलोड की बहुत आवश्यकता होती है .....

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.