__file__ वैरिएबल का क्या मतलब / है?


177
A = os.path.join(os.path.dirname(__file__), '..')

B = os.path.dirname(os.path.realpath(__file__))

C = os.path.abspath(os.path.dirname(__file__))

मैं आमतौर पर वास्तविक पथ के साथ इन्हें हार्डवेअर करता हूं। लेकिन इन वक्तव्यों का एक कारण यह है कि रनटाइम पर पथ का निर्धारण होता है, और मैं वास्तव में os.path मॉड्यूल को समझना चाहूंगा ताकि मैं इसका उपयोग करना शुरू कर सकूं।

जवाबों:


162

जब पायथन में एक फ़ाइल से एक मॉड्यूल लोड किया __file__जाता है , तो इसके पथ पर सेट किया जाता है। तब आप उस निर्देशिका को खोजने के लिए अन्य कार्यों के साथ उपयोग कर सकते हैं जो फ़ाइल में स्थित है।

एक बार में अपने उदाहरण लेना:

A = os.path.join(os.path.dirname(__file__), '..')
# A is the parent directory of the directory where program resides.

B = os.path.dirname(os.path.realpath(__file__))
# B is the canonicalised (?) directory where the program resides.

C = os.path.abspath(os.path.dirname(__file__))
# C is the absolute path of the directory where the program resides.

आप यहाँ से लौटे विभिन्न मूल्यों को देख सकते हैं:

import os
print(__file__)
print(os.path.join(os.path.dirname(__file__), '..'))
print(os.path.dirname(os.path.realpath(__file__)))
print(os.path.abspath(os.path.dirname(__file__)))

और सुनिश्चित करें कि आप इसे विभिन्न स्थानों (जैसे ./text.py, ~/python/text.pyऔर आगे) से चलाते हैं कि क्या फर्क पड़ता है।


7
अच्छा उत्तर, लेकिन अन्य उत्तरों से अन्य महत्वपूर्ण विवरण देखें: __file__सभी मामलों में परिभाषित नहीं किया गया है, उदाहरण के लिए सांख्यिकीय रूप से जुड़े सी मॉड्यूल। हम __file__हमेशा उपलब्ध होने पर भरोसा नहीं कर सकते ।
क्रिस जॉनसन

5
दुभाषिया में, सभी उदाहरण लौटते हैं name '__file__' is not defined
user1063287

10
@ user1063287 डेमोउज़र के उत्तर को देखें; __file__उस फ़ाइल का पथनाम है जिसमें से मॉड्यूल लोड किया गया था, अगर वह फ़ाइल से लोड किया गया था। इसका मतलब __file__केवल तभी काम करेगा जब आप इसे स्क्रिप्ट में इंटरप्रेटर के रूप में चलाएंगे। (जब तक आप इसे इंटरप्रेटर में इंपोर्ट नहीं करते ...)
YOUNG

59

मैं पहले कुछ भ्रम को दूर करना चाहता हूं। __file__एक वाइल्डकार्ड नहीं है यह एक विशेषता है। डबल अंडरस्कोर विशेषताओं और तरीकों को सम्मेलन द्वारा "विशेष" माना जाता है और एक विशेष उद्देश्य की सेवा करता है।

http://docs.python.org/reference/datamodel.html कई विशेष विधियों और विशेषताओं को दिखाता है, यदि वे सभी नहीं हैं।

इस मामले __file__में एक मॉड्यूल (एक मॉड्यूल ऑब्जेक्ट) की एक विशेषता है। पायथन में एक .pyफ़ाइल एक मॉड्यूल है। तो import amoduleएक विशेषता होगी __file__जिसका अंतर परिस्थितियों में विभिन्न चीजों का मतलब है।

डॉक्स से लिया गया:

__file__उस फ़ाइल का पथनाम है जिसमें से मॉड्यूल लोड किया गया था, अगर वह फ़ाइल से लोड किया गया था। __file__विशेषता सी मॉड्यूल है कि स्थिर दुभाषिया में जुड़े हुए हैं के लिए मौजूद नहीं है; साझा पुस्तकालय से गतिशील रूप से लोड किए गए विस्तार मॉड्यूल के लिए, यह साझा लाइब्रेरी फ़ाइल का पथनाम है।

आपके मामले में मॉड्यूल __file__वैश्विक नाम स्थान में अपनी विशेषता का उपयोग कर रहा है।

कार्रवाई में इसे देखने के लिए प्रयास करें:

# file: test.py

print globals()
print __file__

और भाग खड़ा हुआ:

python test.py

{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__file__':
 'test_print__file__.py', '__doc__': None, '__package__': None}
test_print__file__.py

23

प्रति प्रलेखन :

__file__उस फ़ाइल का पथनाम है जिसमें से मॉड्यूल लोड किया गया था, अगर वह फ़ाइल से लोड किया गया था। __file__विशेषता सी मॉड्यूल है कि स्थिर दुभाषिया में जुड़े हुए हैं के लिए मौजूद नहीं है; साझा पुस्तकालय से गतिशील रूप से लोड किए गए विस्तार मॉड्यूल के लिए, यह साझा लाइब्रेरी फ़ाइल का पथनाम है।

और भी :

__file__फ़ाइल को "पथ" होना है, जब तक कि मॉड्यूल अंतर्निहित नहीं है (और इस प्रकार सूचीबद्ध है sys.builtin_module_names) जिस स्थिति में विशेषता सेट नहीं है।


13

__file__विभिन्न os.pathमॉड्यूल के साथ संयुक्त का उपयोग करने से सभी पथ वर्तमान मॉड्यूल की निर्देशिका स्थान के सापेक्ष हो सकते हैं। इससे आपके मॉड्यूल / प्रोजेक्ट अन्य मशीनों के लिए पोर्टेबल हो सकते हैं।

अपनी परियोजना में आप करते हैं:

A = '/Users/myname/Projects/mydevproject/somefile.txt'

और फिर इसे अपने सर्वर पर एक परिनियोजन निर्देशिका के साथ परिनियोजित करने का प्रयास करें, जैसे /home/web/mydevproject/तब आपका कोड सही तरीके से पथ नहीं ढूंढ पाएगा।

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