@Kindall द्वारा प्रदान की गई गुइडो मेल की मदद से, हम मानक आयात प्रक्रिया को समझने की कोशिश कर सकते हैं क्योंकि प्रत्येक सदस्य में मॉड्यूल को खोजने की कोशिश की जा रही है sys.path, और इस लुकअप के परिणाम के रूप में फ़ाइल करें ( PyMOTW मॉड्यूल और आयात में अधिक विवरण ।)। इसलिए यदि मॉड्यूल sys.pathपरिणाम में एक पूर्ण पथ में स्थित है, तो निरपेक्ष है, लेकिन यदि यह sys.pathपरिणाम में एक सापेक्ष पथ में स्थित है, तो सापेक्ष है।
अब site.pyस्टार्टअप फाइल sys.pathप्रारंभिक के अलावा केवल पूर्ण पथ देने में ध्यान रखती है '', इसलिए यदि आप PYTHONPATH (जिसका पथ भी पूर्ण बनाया गया है, उपसर्ग से पहले sys.path) सेट करने के अलावा अन्य माध्यमों से इसे नहीं बदलते हैं , तो आपको हमेशा एक पूर्ण मिलेगा पथ, लेकिन जब मॉड्यूल को वर्तमान निर्देशिका के माध्यम से एक्सेस किया जाता है।
अब अगर आप अजीब तरीके से sys.path को ट्रिक करते हैं तो आपको कुछ भी मिल सकता है।
उदाहरण के लिए यदि आपके पास कोड के साथ एक नमूना मॉड्यूल foo.pyहै /tmp/:
import sys
print(sys.path)
print (__file__)
यदि आप / tmp में जाते हैं:
>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
./foo.py
जब आप अंदर आते हैं /home/user, यदि आप /tmpअपना नाम जोड़ते PYTHONPATHहैं:
>>> import foo
['', '/tmp', '/usr/lib/python3.3', ...]
/tmp/foo.py
यदि आप जोड़ते हैं ../../tmp, तो भी इसे सामान्यीकृत किया जाएगा और परिणाम समान होगा।
लेकिन अगर PYTHONPATHआप का उपयोग करने के बजाय सीधे कुछ मज़ेदार पथ का उपयोग करते हैं, तो आपको कारण के रूप में मज़ेदार परिणाम मिलता है।
>>> import sys
>>> sys.path.append('../../tmp')
>>> import foo
['', '/usr/lib/python3.3', .... , '../../tmp']
../../tmp/foo.py
गुइडो उपरोक्त उद्धृत सूत्र में बताते हैं, क्यों अजगर सभी प्रविष्टियों को पूर्ण पथ में बदलने की कोशिश नहीं करते हैं:
हम हर आयात पर getpwd () को कॉल नहीं करना चाहते हैं .... getpwd () अपेक्षाकृत धीमा है और कभी-कभी एकमुश्त,
तो आपके रास्ते का उपयोग किया जाता है जैसा कि यह है ।