मैं इस सवाल पर कुछ बदलावों से निपटने की कोशिश करूंगा:
- तथाकथित स्क्रिप्ट का मार्ग खोजना
- वर्तमान में निष्पादित स्क्रिप्ट का पथ ढूंढ रहा है
- बुलाया स्क्रिप्ट की निर्देशिका ढूँढना
(एसओ पर इनमें से कुछ प्रश्न पूछे गए हैं, लेकिन उन्हें डुप्लिकेट के रूप में बंद कर दिया गया है और यहां पुनर्निर्देशित किया गया है।)
उपयोग करने की कैविट्स __file__
आपके द्वारा आयात किए गए मॉड्यूल के लिए:
import something
something.__file__
मॉड्यूल के पूर्ण पथ को वापस करेगा । हालाँकि, फ़ोलोइंग स्क्रिप्ट foo.py को देखते हुए:
#foo.py
print '__file__', __file__
इसे 'python foo.py' के साथ कॉल करने पर 'foo.py' वापस आ जाएगा। यदि आप एक शेबंग जोड़ते हैं:
#!/usr/bin/python
#foo.py
print '__file__', __file__
और इसे ./foo.py का उपयोग करके कॉल करें, यह वापस आ जाएगा './foo.py'। इसे अलग निर्देशिका से कॉल करना, (जैसे निर्देशिका बार में foo.py डाल), फिर या तो कॉल करना
python bar/foo.py
या शेबबैंग को जोड़ने और फ़ाइल को सीधे निष्पादित करना:
bar/foo.py
'बार / foo.py' ( सापेक्ष पथ) लौटाएगा ।
निर्देशिका ढूँढना
अब निर्देशिका प्राप्त करने के लिए वहाँ से जाना, os.path.dirname(__file__)
मुश्किल भी हो सकता है। कम से कम मेरे सिस्टम पर, यह खाली स्ट्रिंग देता है यदि आप इसे उसी निर्देशिका से फाइल के रूप में कहते हैं। पूर्व।
# foo.py
import os
print '__file__ is:', __file__
print 'os.path.dirname(__file__) is:', os.path.dirname(__file__)
उत्पादन होगा:
__file__ is: foo.py
os.path.dirname(__file__) is:
दूसरे शब्दों में, यह एक खाली स्ट्रिंग लौटाता है, इसलिए यह विश्वसनीय नहीं लगता है यदि आप इसे वर्तमान फ़ाइल के लिए उपयोग करना चाहते हैं (जैसा कि आयातित मॉड्यूल की फ़ाइल के विपरीत )। इसके आस-पास जाने के लिए, आप इसे अबस्पाट में कॉल कर सकते हैं:
# foo.py
import os
print 'os.path.abspath(__file__) is:', os.path.abspath(__file__)
print 'os.path.dirname(os.path.abspath(__file__)) is:', os.path.dirname(os.path.abspath(__file__))
जो कुछ इस तरह का उत्पादन करता है:
os.path.abspath(__file__) is: /home/user/bar/foo.py
os.path.dirname(os.path.abspath(__file__)) is: /home/user/bar
ध्यान दें कि एब्सपैथ () सीमलिंक को हल नहीं करता है। यदि आप ऐसा करना चाहते हैं, तो इसके बजाय realpath () का उपयोग करें। उदाहरण के लिए, निम्न मान के साथ file_import_testing_link को file_import_testing.py की ओर इंगित करते हुए:
import os
print 'abspath(__file__)',os.path.abspath(__file__)
print 'realpath(__file__)',os.path.realpath(__file__)
निष्पादित करने से निरपेक्ष मार्ग प्रिंट हो जाएंगे जैसे:
abspath(__file__) /home/user/file_test_link
realpath(__file__) /home/user/file_test.py
file_import_testing_link -> file_import_testing.py
निरीक्षण का उपयोग करना
@SummerBreeze निरीक्षण मॉड्यूल का उपयोग करने का उल्लेख करता है ।
यह अच्छी तरह से काम करने लगता है, और आयातित मॉड्यूल के लिए काफी संक्षिप्त है:
import os
import inspect
print 'inspect.getfile(os) is:', inspect.getfile(os)
आज्ञाकारी पूर्ण मार्ग देता है। हालाँकि वर्तमान में निष्पादित स्क्रिप्ट का मार्ग खोजने के लिए, मुझे इसका उपयोग करने का तरीका नहीं दिखाई दिया।