पायथन मॉड्यूल और पायथन पैकेज के बीच क्या अंतर है?


575

पायथन मॉड्यूल और पायथन पैकेज के बीच क्या अंतर है?

यह भी देखें: "पैकेज" और "मॉड्यूल" के बीच क्या अंतर है (अन्य भाषाओं के लिए)


9
मैं गलत हो सकता हूं लेकिन मेरे लिए: एक मॉड्यूल मूल रूप से एक अजगर फ़ाइल है। एक पैकेज एक फ़ोल्डर है जिसमें मॉड्यूल (अजगर फ़ाइलों) का एक गुच्छा है।
lc2817

36
पैकेज माना जाता है, उस फ़ोल्डर में एक __init__.pyफ़ाइल होनी चाहिए ।
Giulio Piancastelli

@ lc2817: यह सबसे आम मामला है लेकिन यह आवश्यक के लिए एक मॉड्यूल एक फाइल सिस्टम जैसे से लोड किया जाना नहीं है, को देखने के from plumbum.cmd import lsकार्यान्वयन
JFS


पायथन संकुल, और PyPI / पहियों / आदि जैसे पायथन घटकों को वितरित करने के लिए उपयोग किए जाने वाले पैकेजों के बीच समुदाय कैसे भिन्न होता है? दोनों शब्द "पैकेज" के विभिन्न अनुप्रयोगों की तरह लगते हैं।
द्रविड़

जवाबों:


372

एक मॉड्यूल एक एकल फ़ाइल (या फ़ाइलें) हैं जो एक आयात के तहत आयात की जाती हैं और उपयोग की जाती हैं। जैसे

import my_module

एक पैकेज निर्देशिका में मॉड्यूल का एक संग्रह है जो एक पैकेज पदानुक्रम देता है।

from my_package.timing.danger.internets import function_of_love

मॉड्यूल के लिए प्रलेखन

पैकेज का परिचय


54
जब आप कहते हैं: "एक मॉड्यूल एक फ़ाइल (या फ़ाइलें) हैं जो एक आयात के तहत आयात की जाती हैं" तो क्या आप उस स्थिति की व्याख्या कर सकते हैं जहां एक मॉड्यूल एक से अधिक फ़ाइल है? या मैं गलत समझ रहा हूं कि आपका क्या मतलब है?
यूजर

5
आपको एक मॉड्यूल बनाने के लिए फ़ाइल की आवश्यकता नहीं है, उदाहरण के लिए, आप ज़िप फ़ाइल से एक मॉड्यूल आयात कर सकते हैं। पैकेज के लिए भी। पायथन में मॉड्यूल / पैकेज के लिए केवल एक वर्ग है। पैकेज एक __path__विशेषता के साथ सिर्फ एक मॉड्यूल है ।
JFS

33
पैकेज मॉड्यूल भी हैं । वे सिर्फ अलग तरीके से पैक किए जाते हैं; वे एक निर्देशिका प्लस __init__.pyफ़ाइल के संयोजन से बनते हैं । वे ऐसे मॉड्यूल हैं जिनमें अन्य मॉड्यूल शामिल हो सकते हैं।
मार्टिन पीटर्स

15
@Jacquot यकीन है, संदर्भ प्रलेखन में आयात प्रणाली देखें : यह ध्यान रखना महत्वपूर्ण है कि सभी पैकेज मॉड्यूल हैं
मार्टिन पीटर्स

6
@Jacquot: और "पैकेज" पर शब्दावली : एक पायथन मॉड्यूल जिसमें__path__
मार्टिन पीटर्स

556

कोई भी पायथन फ़ाइल एक मॉड्यूल है , इसका नाम .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, सी में लिखे गए हैं, लेकिन मुझे नहीं लगता कि आप अपने प्रश्न में उन लोगों पर विचार करना चाहते थे।


9
स्पष्ट रूप से उल्लेख करने के लिए धन्यवाद कि पायथन द्वारा बनाई गई संबंधित वस्तु हमेशा प्रकार की होती है module। मैं डिबगर लिखने की प्रक्रिया में हूं और चिंतित था कि मेरा डिबगर यह कहने में गलत था कि मेरे पैकेज moduleएस थे ।
आर्टऑफवर्फ

8
@jolvi पायथन फाइल जिसमें फ़ाइल नाम वाले डैश अभी भी मॉड्यूल के रूप में आयात किए जा सकते हैं, सामान्य importविवरण के साथ नहीं , क्योंकि पायथन पहचानकर्ताओं में डैश की अनुमति नहीं है। importlib.import_module()इसके बजाय उपयोग करें ।
गिउलिओ पियानकैसेली

2
@ जोलवी मैं नहीं हूँ। मेरी टिप्पणी में आप कहाँ पढ़ रहे हैं? मैं सिर्फ इतना कह रहा हूं, अगर आपके पास पायथन फाइल है या उसके नाम में डैश है, तो भी आप इसे मॉड्यूल के रूप में आयात कर सकते हैं। मैं पायथन फ़ाइल के नामकरण के पसंदीदा तरीके के बारे में एक बयान नहीं दे रहा हूं। मुझे यकीन है कि आप कहीं और पा सकते हैं: यह आमतौर पर अंडरस्कोर के पक्ष में डैश से बचने के लिए दृढ़ता से सलाह दी जाती है।
Giulio Piancastelli

3
पायथन के लिए नया होने के नाते, मूल पैकेज को आयात करते समय उप-पैकेज या मॉड्यूल डिफ़ॉल्ट रूप से उपलब्ध नहीं होते हैं, जिसने मुझे ठोकर खाई है। क्या उसका कोई विशेष कारण है? और वहाँ एक आम पैटर्न कैसे करना है कर जब माता-पिता पैकेज का आयात उप संकुल या उपलब्ध मॉड्यूल (उनकी पूरी तरह से योग्य नाम के माध्यम से)?
sschuberth

2
में @sschuberth बस आयात उप संकुल init एक माता पिता के पैकेज की .py।
अन्ना

33

से अजगर शब्दकोष :

यह ध्यान रखना महत्वपूर्ण है कि सभी पैकेज मॉड्यूल हैं, लेकिन सभी मॉड्यूल पैकेज नहीं हैं। या एक और तरीका है, पैकेज सिर्फ एक विशेष प्रकार के मॉड्यूल हैं। विशेष रूप से, किसी भी मॉड्यूल में एक __path__विशेषता होती है जिसे एक पैकेज माना जाता है।

नाम में एक डैश के साथ पायथन फाइलें, my-file.pyएक साधारण importकथन के साथ आयात नहीं की जा सकती हैं । कोड-वार, import my-fileवही है import my - fileजो एक अपवाद को बढ़ाएगा। ऐसी फाइलें स्क्रिप्ट के रूप में बेहतर होती हैं, जबकि आयात करने योग्य फाइलें मॉड्यूल हैं


23

सबसे पहले, ध्यान रखें कि, इसकी सटीक परिभाषा में, एक मॉड्यूल पायथन दुभाषिया की स्मृति में एक वस्तु है, जिसे अक्सर डिस्क से एक या अधिक फ़ाइलों को पढ़कर बनाया जाता है। हालांकि हम अनौपचारिक रूप से एक डिस्क फ़ाइल जैसे 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नहीं है।


1
यदि आपके पास पहले से नहीं है, तो वापस जाएं और इस उत्तर में उदाहरणों के माध्यम से काम करें।
डोनाल्ड लफेरी

2

एक देर से जवाब, फिर भी एक और परिभाषा:

एक पैकेज एक आयातित शीर्ष-इकाई द्वारा दर्शाया जाता है जो या तो एक स्व-निहित मॉड्यूल हो सकता है, या __init__.pyएक उप-निर्देशिका संरचना के भीतर मॉड्यूल के सेट से शीर्ष-इकाई के रूप में विशेष मॉड्यूल।

तो शारीरिक रूप से एक पैकेज एक वितरण इकाई है, जो एक या अधिक मॉड्यूल प्रदान करता है।


1
मुझे लगता है कि पायथन में पैकेज के लिए दो परिभाषाएं हैं और वे अलग हैं। आपका उत्तर उन्हें एक साथ जोड़ देता है। कड़ाई से बोलते हुए, एक अजगर पैकेज __init__.pyअंदर एक मॉड्यूल के साथ एक निर्देशिका है, फिर भी यदि आप वितरण इकाइयों के बारे में बात करते हैं (आमतौर पर PyPI के माध्यम से) तो यह पूरी तरह से एक अन्य प्रकार का पैकेज है (आमतौर पर अस्तित्व द्वारा परिभाषित setup.py)। मुझे packageभ्रमित करने वाले शब्द के ये दो उपयोग मिलते हैं, और मैंने कुछ पायथन शुरुआती लोगों से बात की है जो इसे पूरी तरह से आश्चर्यचकित करते हैं।
द्रविड़

@davidA, ऐसा नहीं है कि आप कैसा महसूस करते हैं। यह संहिताबद्ध किया गया है: पैकेजिंगहोमथॉनऑन .
लोरम इप्सम

0

पैकेज एक मॉड्यूल भी है जिसमें अन्य मॉड्यूल, 'सरल फ़ाइल-आधारित मॉड्यूल और पैकेज (उप-पैकेज)' हो सकते हैं। पैकेज प्रकार के मॉड्यूल से संबंधित कोड __init__.pyफ़ाइल में जाता है ।

import pack1
print(type(pack1))

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.