पायथन मॉड्यूल और पायथन पैकेज के बीच क्या अंतर है?
यह भी देखें: "पैकेज" और "मॉड्यूल" के बीच क्या अंतर है (अन्य भाषाओं के लिए)
__init__.pyफ़ाइल होनी चाहिए ।
from plumbum.cmd import lsकार्यान्वयन
__init__.py
पायथन मॉड्यूल और पायथन पैकेज के बीच क्या अंतर है?
यह भी देखें: "पैकेज" और "मॉड्यूल" के बीच क्या अंतर है (अन्य भाषाओं के लिए)
__init__.pyफ़ाइल होनी चाहिए ।
from plumbum.cmd import lsकार्यान्वयन
__init__.py
जवाबों:
एक मॉड्यूल एक एकल फ़ाइल (या फ़ाइलें) हैं जो एक आयात के तहत आयात की जाती हैं और उपयोग की जाती हैं। जैसे
import my_module
एक पैकेज निर्देशिका में मॉड्यूल का एक संग्रह है जो एक पैकेज पदानुक्रम देता है।
from my_package.timing.danger.internets import function_of_love
__path__विशेषता के साथ सिर्फ एक मॉड्यूल है ।
__init__.pyफ़ाइल के संयोजन से बनते हैं । वे ऐसे मॉड्यूल हैं जिनमें अन्य मॉड्यूल शामिल हो सकते हैं।
__path__
कोई भी पायथन फ़ाइल एक मॉड्यूल है , इसका नाम .pyएक्सटेंशन के बिना फ़ाइल का आधार नाम है । एक पैकेज पायथन मॉड्यूल का एक संग्रह है: जबकि एक मॉड्यूल एक एकल पायथन फ़ाइल है, एक पैकेज एक अतिरिक्त __init__.pyफ़ाइल वाले पायथन मॉड्यूल की एक निर्देशिका है, एक पैकेज से एक निर्देशिका को अलग करने के लिए जो सिर्फ पायथन स्क्रिप्ट का एक गुच्छा होता है। पैकेजों को किसी भी गहराई तक घोंसला दिया जा सकता है, बशर्ते कि संबंधित निर्देशिकाओं की अपनी __init__.pyफ़ाइल हो।
मॉड्यूल और पैकेज के बीच का अंतर सिर्फ फाइल सिस्टम स्तर पर पकड़ है। जब आप किसी मॉड्यूल या पैकेज को आयात करते हैं, तो पायथन द्वारा बनाई गई संबंधित वस्तु हमेशा प्रकार की होती है module। ध्यान दें, तथापि, जब आप एक पैकेज आयात करते हैं, केवल चर / कार्य / में कक्षाएं __init__.pyकि पैकेज की फ़ाइल सीधे, दिखाई दे रहे हैं नहीं उप संकुल या मॉड्यूल। एक उदाहरण के रूप xmlमें, पायथन मानक पुस्तकालय में पैकेज पर विचार करें : इसकी xmlनिर्देशिका में एक __init__.pyफ़ाइल और चार उप-निर्देशिकाएं हैं; उप-निर्देशिका etreeमें एक __init__.pyफ़ाइल और, दूसरों के बीच, एक ElementTree.pyफ़ाइल होती है। देखें कि जब आप इंटरेक्टिव रूप से आयात पैकेज / मॉड्यूल का प्रयास करते हैं तो क्या होता है:
>>> import xml
>>> type(xml)
<type 'module'>
>>> xml.etree.ElementTree
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'etree'
>>> import xml.etree
>>> type(xml.etree)
<type 'module'>
>>> xml.etree.ElementTree
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'ElementTree'
>>> import xml.etree.ElementTree
>>> type(xml.etree.ElementTree)
<type 'module'>
>>> xml.etree.ElementTree.parse
<function parse at 0x00B135B0>
पायथन में भी अंतर्निहित मॉड्यूल हैं, जैसे कि sys, सी में लिखे गए हैं, लेकिन मुझे नहीं लगता कि आप अपने प्रश्न में उन लोगों पर विचार करना चाहते थे।
module। मैं डिबगर लिखने की प्रक्रिया में हूं और चिंतित था कि मेरा डिबगर यह कहने में गलत था कि मेरे पैकेज moduleएस थे ।
importविवरण के साथ नहीं , क्योंकि पायथन पहचानकर्ताओं में डैश की अनुमति नहीं है। importlib.import_module()इसके बजाय उपयोग करें ।
से अजगर शब्दकोष :
यह ध्यान रखना महत्वपूर्ण है कि सभी पैकेज मॉड्यूल हैं, लेकिन सभी मॉड्यूल पैकेज नहीं हैं। या एक और तरीका है, पैकेज सिर्फ एक विशेष प्रकार के मॉड्यूल हैं। विशेष रूप से, किसी भी मॉड्यूल में एक
__path__विशेषता होती है जिसे एक पैकेज माना जाता है।
नाम में एक डैश के साथ पायथन फाइलें, my-file.pyएक साधारण importकथन के साथ आयात नहीं की जा सकती हैं । कोड-वार, import my-fileवही है import my - fileजो एक अपवाद को बढ़ाएगा। ऐसी फाइलें स्क्रिप्ट के रूप में बेहतर होती हैं, जबकि आयात करने योग्य फाइलें मॉड्यूल हैं ।
सबसे पहले, ध्यान रखें कि, इसकी सटीक परिभाषा में, एक मॉड्यूल पायथन दुभाषिया की स्मृति में एक वस्तु है, जिसे अक्सर डिस्क से एक या अधिक फ़ाइलों को पढ़कर बनाया जाता है। हालांकि हम अनौपचारिक रूप से एक डिस्क फ़ाइल जैसे a/b/c.py"मॉड्यूल" को कॉल कर सकते हैं , यह वास्तव में एक नहीं बन जाता है जब तक कि यह sys.pathमॉड्यूल ऑब्जेक्ट बनाने के लिए कई अन्य स्रोतों (जैसे कि ) से जानकारी के साथ संयुक्त न हो ।
(नोट, उदाहरण के लिए, कि अलग-अलग नामों वाले दो मॉड्यूल को एक ही फ़ाइल से लोड किया जा सकता है, sys.pathयह और अन्य सेटिंग्स पर निर्भर करता है । ठीक यही है कि इंटरप्रेटर में python -m my.moduleइसके बाद क्या होता है import my.module; दो मॉड्यूल ऑब्जेक्ट होंगे, __main__और my.module, दोनों बनाए गए डिस्क पर एक ही फ़ाइल से my/module.py;)
एक पैकेज एक मॉड्यूल है जिसमें सबमॉड्यूल्स (उप- पैकेज सहित) हो सकते हैं। सभी मॉड्यूल ऐसा नहीं कर सकते। एक उदाहरण के रूप में, एक छोटा मॉड्यूल पदानुक्रम बनाएं:
$ mkdir -p a/b
$ touch a/b/c.py
सुनिश्चित करें कि कोई अन्य फ़ाइल के अंतर्गत नहीं हैं a। पायथन 3.4 शुरू करें या बाद में दुभाषिया (जैसे, साथ python3 -i) और निम्नलिखित कथनों के परिणामों की जांच करें:
import a
a ⇒ <module 'a' (namespace)>
a.b ⇒ AttributeError: module 'a' has no attribute 'b'
import a.b.c
a.b ⇒ <module 'a.b' (namespace)>
a.b.c ⇒ <module 'a.b.c' from '/home/cjs/a/b/c.py'>
मॉड्यूल aऔर a.bपैकेज हैं (वास्तव में, एक निश्चित प्रकार का पैकेज जिसे "नेमस्पेस पैकेज" कहा जाता है, हालांकि हम यहां के बारे में चिंता नहीं करते हैं)। हालांकि, मॉड्यूल a.b.cएक पैकेज नहीं है। हम इसे एक और फ़ाइल जोड़कर, a/b.pyऊपर दी गई निर्देशिका संरचना में और एक नया दुभाषिया शुरू करके प्रदर्शित कर सकते हैं :
import a.b.c
⇒ ImportError: No module named 'a.b.c'; 'a.b' is not a package
import a.b
a ⇒ <module 'a' (namespace)>
a.__path__ ⇒ _NamespacePath(['/.../a'])
a.b ⇒ <module 'a.b' from '/home/cjs/tmp/a/b.py'>
a.b.__path__ ⇒ AttributeError: 'module' object has no attribute '__path__'
पायथन सुनिश्चित करता है कि चाइल्ड मॉड्यूल लोड होने से पहले सभी मूल मॉड्यूल लोड किए जाते हैं। ऊपर यह पता चलता है कि a/यह एक निर्देशिका है, और इसलिए एक नाम स्थान पैकेज बनाता है a, और a/b.pyयह एक पायथन स्रोत फ़ाइल है जिसे यह लोड करता है और एक (गैर-पैकेज) मॉड्यूल बनाने के लिए उपयोग करता है a.b। इस बिंदु पर आपके पास एक मॉड्यूल नहीं हो सकता है a.b.cक्योंकि a.bपैकेज नहीं है, और इस तरह सबमॉड्यूल नहीं हो सकता है।
आप यहां यह भी देख सकते हैं कि पैकेज मॉड्यूल aमें एक __path__विशेषता है (पैकेज में यह होना चाहिए) लेकिन गैर-पैकेज मॉड्यूल a.bनहीं है।
एक देर से जवाब, फिर भी एक और परिभाषा:
एक पैकेज एक आयातित शीर्ष-इकाई द्वारा दर्शाया जाता है जो या तो एक स्व-निहित मॉड्यूल हो सकता है, या
__init__.pyएक उप-निर्देशिका संरचना के भीतर मॉड्यूल के सेट से शीर्ष-इकाई के रूप में विशेष मॉड्यूल।
तो शारीरिक रूप से एक पैकेज एक वितरण इकाई है, जो एक या अधिक मॉड्यूल प्रदान करता है।
__init__.pyअंदर एक मॉड्यूल के साथ एक निर्देशिका है, फिर भी यदि आप वितरण इकाइयों के बारे में बात करते हैं (आमतौर पर PyPI के माध्यम से) तो यह पूरी तरह से एक अन्य प्रकार का पैकेज है (आमतौर पर अस्तित्व द्वारा परिभाषित setup.py)। मुझे packageभ्रमित करने वाले शब्द के ये दो उपयोग मिलते हैं, और मैंने कुछ पायथन शुरुआती लोगों से बात की है जो इसे पूरी तरह से आश्चर्यचकित करते हैं।
पैकेज एक मॉड्यूल भी है जिसमें अन्य मॉड्यूल, 'सरल फ़ाइल-आधारित मॉड्यूल और पैकेज (उप-पैकेज)' हो सकते हैं। पैकेज प्रकार के मॉड्यूल से संबंधित कोड __init__.pyफ़ाइल में जाता है ।
import pack1
print(type(pack1))
जबकि मॉड्यूल एक साधारण फ़ाइल है जिसमें एक मॉड्यूल आयात करने के बाद फ़ंक्शंस, क्लासेस, रन करने योग्य कोड आदि हो सकते हैं, यह एक ऑब्जेक्ट की तरह व्यवहार करता है जिसके द्वारा आप मॉड्यूल में परिभाषित पहचानकर्ताओं तक पहुंच सकते हैं।