2010-09-23 14 views
56

मैंने आज कुछ अजीब देखा जो मैं समझाऊंगा। मैं 100% निश्चित नहीं था कि इसे एक प्रश्न के रूप में कैसे वाक्यांशित किया जाए, इसलिए Google प्रश्न से बाहर है। कुछ अजीब कारणों से लॉगिंग मॉड्यूल को मॉड्यूल लॉगिंग तक पहुंच नहीं है। अगर आप मुझ पर विश्वास नहीं करते हैं तो इसे स्वयं आज़माएं:पाइथन मॉड्यूल कभी-कभी अपने उप-मॉड्यूल क्यों आयात नहीं करते हैं?

>>> import logging 
>>> logging.handlers 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'module' object has no attribute 'handlers' 
>>> import logging.handlers 
>>> logging.handlers 
<module 'logging.handlers' from '/usr/lib/python2.6/logging/handlers.pyc'> 

क्या कोई यह समझा सकता है कि ऐसा क्यों होता है?

उत्तर

73

पायथन में, मॉड्यूल को पहुंचने से पहले आयात करने की आवश्यकता है। import logging केवल लॉगिंग मॉड्यूल आयात करता है। ऐसा इसलिए होता है कि logging submodules के साथ एक पैकेज है, लेकिन उन submodules अभी भी स्वचालित रूप से लोड नहीं हैं। इसलिए, इससे पहले कि आप इसे एक्सेस कर सकें, आपको स्पष्ट रूप से logging.handlers आयात करना होगा।

यदि आप सोच रहे हैं कि ऐसा क्यों लगता है कि कभी-कभी आपको उन अतिरिक्त आयातों की आवश्यकता नहीं होती है: कुछ पैकेज आयात किए जाने पर उनके कुछ या सभी सबमिड्यूल आयात करते हैं - बस __init__.py फ़ाइलों में उन आयातों को करके। अन्य मामलों में यह हो सकता है कि आप आयात करने वाले कुछ और, logging.handlers आयात भी करें। इससे कोई फ़र्क नहीं पड़ता कि कोड का कौन सा टुकड़ा आयात करता है; जब तक आप इसे एक्सेस करने से पहले कुछ आपकी प्रक्रिया में logging.handlers आयात करते हैं, तो यह वहां होगा। और कभी-कभी एक मॉड्यूल जो एक पैकेज की तरह दिखता है वास्तव में एक नहीं है, जैसे os और os.pathos पैकेज नहीं है, यह सिर्फ सही अन्य मॉड्यूल (आपके प्लेटफ़ॉर्म के लिए) आयात करता है और इसे path पर कॉल करता है, बस आप इसे os.path के रूप में एक्सेस कर सकते हैं।

3

मैं भी अजगर को और अभ्यास अब मैं के बीच, पैकेज (फ़ोल्डर), मॉड्यूल (.py), कक्षाएं, चर ... आदि अंतर कर सकते हैं की बहुत सारी करने के बाद नया हूँ ...

अगर आप चाहते हैं कि आपका कोई भी फ़ोल्डर पाइथन पैकेज हो - इसमें __init__.py फ़ाइल होनी चाहिए, यहां तक ​​कि खाली फ़ाइल भी होगी !!!

और थॉमस ने कहा, आप __init__.p वाई में अतिरिक्त मॉड्यूल आयात कर सकते हैं यदि आप चाहें !!! लेकिन मॉड्यूल/संकुल, सुलभ यह आयात करने के बाद ही ...

क्या आप

from logging import * 

शेष भाग का उपयोग कर सकते हैं संचालकों नीचे भी तरह मॉड्यूल का उपयोग कर सकते एक मॉड्यूल से सब कुछ आयात करना चाहते हैं कर रहे हैं

from loggin import handlers 
print dir(handlers) 
+3

कृपया 'मॉड्यूल आयात * से' का उपयोग न करें। यह लगभग हमेशा एक गलती है। –

+0

यदि आप पैकेज में स्वचालित रूप से आयात करने के लिए सबकुछ चाहते हैं, तो __init__.py में __all__ को सेट करने और कहीं से 'पैकेज आयात *' करने के बजाय, __init__.py में उन आयातों को करें। –

+0

हाँ, आप सही हैं! मॉड्यूल आयात से – shahjapan

1

मुझे हाल ही में एक ही अजीब स्थिति का सामना करना पड़ा है। इसलिए, मुझे यकीन है कि आपने कुछ तृतीय-पक्ष lib आयात हटा दिया है। उस हटाए गए lib में from logging import handlers या from logging import * शामिल है और आपको handlers प्रदान किया गया है। और दूसरी स्क्रिप्ट में आपके पास import logging जैसा कुछ था और आपने logging.handlers का उपयोग किया और आपने सोचा कि यह एक तरह से काम करता है जैसा मैंने किया था।

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