2012-07-28 17 views
8

मैं किसी लोड किए गए मॉड्यूल बनाम आयातित मॉड्यूल के बीच अंतर को समझने की कोशिश कर रहा हूं, यदि कोई है तो।पायथन sys.modules में एक मॉड्यूल है जो अभी तक आयात नहीं किया गया है

मैं पायथन 2.7.3 में काम कर रहा हूं, और बस कमांड लाइन से पाइथन चला रहा हूं।

अगर मैं निष्पादित करें:

import sys 
sys.modules 

मैं एक सूची है जो os भी शामिल है, उदाहरण के लिए मिलता है। दस्तावेज कहता है कि sys.modules "लोड" मॉड्यूल की एक सूची है। हालांकि, अगर मैं os.environ जैसे कुछ चलाने की कोशिश करता हूं, तो मुझे एक नाम त्रुटि मिलती है जो मुझे बताती है कि os परिभाषित नहीं है। हालांकि, अगर मैं import os चलाता हूं, तो यह समस्या हल करता है। क्या कोई वास्तव में मॉड्यूल आयात करने से पहले ossys.modules में मौजूद है?

+0

एक नया खोल खोलें और चरणों को देखें। पोस्ट विवरण या बेहतर, अभी तक स्क्रीन शॉट्स। मॉड्यूल ओएस sys में नहीं रहता है। –

उत्तर

9

आयातित और लोड होने वाले मॉड्यूल के बीच का अंतर आपके वर्तमान मॉड्यूल के नामस्थान में रखा गया है। एक मॉड्यूल केवल एक बार (सामान्य परिस्थितियों में) लोड हो जाएगा, लेकिन कई अलग-अलग स्थानों से कई बार आयात किया जा सकता है। एक लोडेड मॉड्यूल किसी दिए गए नेमस्पेस में पहुंच योग्य नहीं हो सकता है, अगर उसे वहां आयात नहीं किया गया है। उदाहरण के लिए, आप from module import name सिंटैक्स का उपयोग करके इसे अपने नाम के तहत आयात किए बिना मॉड्यूल लोड कर सकते हैं (आप निर्दिष्ट नाम तक पहुंच पाएंगे, लेकिन मॉड्यूल स्वयं नहीं)।

आप os मॉड्यूल को sys.modules शब्दकोश में देख रहे हैं क्योंकि इसका उपयोग पाइथन दुभाषिया द्वारा आंतरिक रूप से किया जाता है, और इसलिए यह हमेशा स्टार्टअप पर लोड होता है। हालांकि आप "ओएस" नाम का उपयोग करके इसका उपयोग नहीं कर सकते हैं, क्योंकि यह स्वचालित रूप से आपके नेमस्पेस में आयात नहीं होता है।

हालांकि, आप कुछ तरीकों से सामान्य आयात तंत्र को बाईपास कर सकते हैं। उदाहरण के लिए, इस प्रयास करें:

import sys 
os = sys.modules["os"] 

अब आप os मॉड्यूल का उपयोग करने की जैसे कि आपने import os किया था सकेंगे।

ऐसा इसलिए है क्योंकि उस कोड ठीक है जब आप एक मॉड्यूल है कि पहले से ही लोड किया गया है का अनुरोध क्या एक import बयान करता है। हालांकि, यदि आप अभी तक लोड नहीं किए गए मॉड्यूल के साथ कोड को आज़माएं, तो यह काम नहीं करेगा (आपको sys.modules शब्दकोश से एक महत्वपूर्ण त्रुटि मिल जाएगी)। import कथन वर्तमान नामस्थान में जोड़ने के अलावा नए मॉड्यूल लोड करता है। जबकि आप मैन्युअल रूप से नियमित आयात प्रणाली के आसपास मॉड्यूल लोड कर सकते हैं और आगे काम कर सकते हैं, ऐसा करने के लिए शायद ही कोई अच्छा कारण है।

+0

धन्यवाद, इससे बहुत मदद मिली! – Justin

संबंधित मुद्दे