2012-02-14 15 views
56
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 मॉड्यूल को समझना चाहता हूं ताकि मैं इसका उपयोग शुरू कर सकूं।__file__ चर का अर्थ क्या है/करता है?

+5

जाहिर है, यह एक वाइल्डकार्ड नहीं है। – tripleee

+3

इसका एक "जादू" चर; वाइल्डकार्ड का मतलब कुछ अलग है। –

उत्तर

66

जब पाइथन में एक मॉड्यूल लोड होता है, __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 और आगे) से चलाने के बनाते हैं।

+3

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

+2

दुभाषिया में, सभी उदाहरण 'नाम' __file__ 'को परिभाषित नहीं किया गया है'। – user1063287

+2

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

10

प्रति documentation:

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

और also:

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

8

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

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

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

और फिर /home/web/mydevproject/ की तरह एक तैनाती निर्देशिका के साथ अपने सर्वर पर तैनात करने के लिए फिर अपना कोड पथ सही ढंग से पता लगाने के लिए सक्षम नहीं होगा की कोशिश करो।

30

मैं बस कुछ भ्रम को संबोधित करना चाहता हूं। __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 
संबंधित मुद्दे