2009-06-07 9 views
109

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

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

त्रुटि क्या मतलब है:

निष्पादित reload(foo) इस त्रुटि दे रहा है?

उत्तर

-10

आपने अपना __builtins__ चर हटा दिया है।

इसे कैसे ठीक करें? __builtins__ को न हटाएं।

Also can someone explain step by step what that error message means?

इसका मतलब है कि पाइथन फ़ंक्शन "पुनः लोड" नहीं ढूंढ सकता है।

reload (script4.py)

यह गलत है। अगर आपने "स्क्रिप्ट 4 आयात" किया है, तो आपको "पुनः लोड (स्क्रिप्ट 4)"

+0

मैं एक ही त्रुटि हो रही है, लेकिन मेरी __builtins__ मौजूद – Billybonks

+0

कहां है वह हिस्सा जहां वह '__builtins__' – OverCoder

160

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

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

  • अजगर 3.4 के लिए और
  • 3.3 करने के लिए अजगर 3.0 के लिए imp.reload ऊपर importlib.reload (importlib के पक्ष में अजगर 3.4 के बाद से पदावनत)
+16

हटा रहा है यह उत्तर पाइथन 3 में मॉड्यूल को फिर से लोड करना बुरा लगता है। इसके पीछे क्या सोच है? – ABM

+5

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

+2

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

50
import imp 
imp.reload(script4) 
+3

पाइथन 3.4 के बाद से बहिष्कृत - इसके बजाय 'importlib' का उपयोग करें। –

46

> = Python3.4 के लिए:

import importlib 
importlib.reload(module) 

लिए < = Python3.3:

import imp 
imp.reload(module) 

Python2.x के लिए:

उपयोग में निर्मित reload() कार्य करते हैं।

reload(module) 
15

पहले से लिखा जवाब पर विस्तार करने के लिए, यदि आप एक ही समाधान है जो अजगर संस्करण 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 
+11

पाइथन 2 से 3 तक नहीं बढ़ रहा है इतना मजेदार है? – speedplane

+0

बहुत उपयोगी! धन्यवाद। –

8

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

from six.moves import reload_module 
reload_module(module)