पायथन मॉड्यूल और पायथन पैकेज के बीच क्या अंतर है?
यह भी देखें: "पैकेज" और "मॉड्यूल" के बीच क्या अंतर है (अन्य भाषाओं के लिए)
__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))
जबकि मॉड्यूल एक साधारण फ़ाइल है जिसमें एक मॉड्यूल आयात करने के बाद फ़ंक्शंस, क्लासेस, रन करने योग्य कोड आदि हो सकते हैं, यह एक ऑब्जेक्ट की तरह व्यवहार करता है जिसके द्वारा आप मॉड्यूल में परिभाषित पहचानकर्ताओं तक पहुंच सकते हैं।