कई बार जब हम पायथन कोड बनाते हैं तो हमें पता चलता है कि हमें किसी अन्य पायथन फ़ाइल या पैकेज से कोड एक्सेस करने की आवश्यकता है। यह तब होता है जब आपको उस अन्य पायथन फ़ाइल या पैकेज को अपने वर्तमान कोड में आयात करने की आवश्यकता होती है। इसे प्राप्त करने का सीधा तरीका बस अपने वर्तमान पायथन प्रोग्राम के शीर्ष पर नीचे दिया गया स्टेटमेंट लिखना है।
import package_name or module_name or from package_name import module_name/object_name
जब उपरोक्त स्टेटमेंट पार्स किया जाता है तो इंटरप्रेटर निम्न कार्य करता है।
इंटरप्रेटर पहले से आयात किए गए सभी मॉड्यूल्स के कैश में नामों को खोजेगा। इस कैश मॉड्यूल का नाम sys.modules है।
यदि उपरोक्त चरण में नहीं मिला तो इंटरप्रेटर बिल्ट-इन मॉड्यूल्स की सूची में खोजेगा। ये मॉड्यूल पायथन स्टैंडर्ड लाइब्रेरी का हिस्सा हैं।
यदि चरण-2 में भी नहीं मिला, तो इंटरप्रेटर sys.path में परिभाषित निर्देशिकाओं की सूची में पैकेज या मॉड्यूल नामों की खोज करेगा जिसमें वर्तमान निर्देशिका खोजी जाने वाली पहली निर्देशिका है।
उपरोक्त किसी भी चरण में आयात किए गए मॉड्यूल को खोजने पर, पैकेज या मॉड्यूल का नाम वर्तमान प्रोग्राम के स्थानीय स्कोप से बांध दिया जाता है।
यदि पैकेज या मॉड्यूल कभी नहीं मिलता है, तो ModuleNotFoundError उत्पन्न होता है।
आयात के बारे में कुछ नियम।
आयात स्टेटमेंट्स को उन फ़ाइलों के शीर्ष पर उल्लेख किया जाना चाहिए जो उन स्टेटमेंट्स का उपयोग करती हैं। आयात का क्रम निम्नानुसार होना चाहिए।
पायथन के स्टैंडर्ड लाइब्रेरी मॉड्यूल्स
थर्ड-पार्टी मॉड्यूल्स से आयात
लोकल एप्लिकेशन से आयात
निरपेक्ष आयात (Absolute Import)
इस प्रकार के आयात में, हम आयात किए जाने वाले पैकेज/मॉड्यूल/फ़ंक्शन का पूरा पथ निर्दिष्ट करते हैं। डॉट (.) का उपयोग निर्देशिका संरचना के लिए स्लैश (/) के स्थान पर किया जाता है।
पैकेज के लिए निम्न निर्देशिका संरचना पर विचार करें।
python_project_name/packageA/moduleA1.py python_project_name/packageA/moduleA2.py
साथ ही, मान लें कि moduleA2 में myfunc नामक एक फ़ंक्शन है। जब हम उस फ़ंक्शन को अपने वर्तमान पायथन प्रोग्राम में आयात करना चाहते हैं, तो निरपेक्ष पथ का उपयोग करके हम निम्न आयात स्टेटमेंट का उल्लेख करते हैं।
from packageA.moduleA2 import myfunc
निरपेक्ष आयात का बड़ा लाभ यह है, यह स्पष्ट रूप से इंगित करता है कि आयात कहाँ हो रहा है, दूसरी तरफ कभी-कभी यह काफी लंबा हो सकता है।
सापेक्ष आयात (Relative Import)
सापेक्ष आयात में, हम आयात किए गए पैकेज के पथ को वर्तमान स्क्रिप्ट के स्थान के सापेक्ष उल्लेख करते हैं जो आयातित मॉड्यूल का उपयोग कर रही है।
एक डॉट वर्तमान स्थान से एक निर्देशिका ऊपर इंगित करता है और दो डॉट दो निर्देशिकाएं ऊपर और इसी तरह।
पैकेज के लिए निम्न निर्देशिका संरचना पर विचार करें।
python_project_name/packageA/moduleA1.py python_project_name/packageB/moduleB1.py
मान लें कि उपरोक्त पैकेज संरचना में moduleB1 को moduleA1 आयात करने की आवश्यकता है। तब आयात स्टेटमेंट है:
from ..packageA import moduleA1
दो डॉट इंगित करते हैं कि moduleB1 के स्थान से, हमें python_project_name निर्देशिका में जाना होगा और फिर moduleA1 प्राप्त करने के लिए packageA में जाना होगा।
इस प्रकार के आयात छोटे होते हैं और शीर्ष स्तर की परियोजना को एक स्थान से दूसरे स्थान पर ले जाया जा सकता है बिना आयात स्टेटमेंट्स में पथ बदले आसानी से। नकारात्मक पक्ष पर, यदि आयात फ़ोल्डर्स साझा किए जाते हैं तो पथ में कुछ संशोधन होने पर कोड आसानी से प्रभावित हो जाता है।