मैं उन फाइलों को खोलता था जो वर्तमान में चल रही पायथन लिपि के समान निर्देशिका में थीं जैसे केवल एक कमांड का उपयोग करके
open("Some file.txt", "r")
हालांकि, मुझे पता चला कि जब स्क्रिप्ट को डबल-क्लिक करके विंडोज में चलाया गया था, तो यह फ़ाइल को गलत निर्देशिका से खोलने का प्रयास करेगा।
तब से मैंने फॉर्म की एक कमांड का उपयोग किया है
open(os.path.join(sys.path[0], "Some file.txt"), "r")
जब भी मैं कोई फाइल खोलना चाहता था। यह मेरे विशेष उपयोग के लिए काम करता है, लेकिन मुझे यकीन नहीं है कि sys.path[0]
कुछ अन्य उपयोग के मामले में विफल हो सकता है।
तो मेरा सवाल यह है कि एक फ़ाइल को खोलने का सबसे अच्छा और सबसे विश्वसनीय तरीका क्या है जो वर्तमान में चल रहे पायथन स्क्रिप्ट के समान है?
यहाँ मैं क्या पता लगाने में सक्षम है:
os.getcwd()
औरos.path.abspath('')
"वर्तमान कार्यशील निर्देशिका" लौटें, स्क्रिप्ट निर्देशिका नहीं।os.path.dirname(sys.argv[0])
औरos.path.dirname(__file__)
स्क्रिप्ट को कॉल करने के लिए उपयोग किए गए पथ पर वापस लौटें, जो सापेक्ष हो सकता है या यहां तक कि रिक्त हो सकता है (यदि स्क्रिप्ट सीडब्ल्यूडी में है)। इसके अलावा,__file__
मौजूद नहीं है जब स्क्रिप्ट निष्क्रिय या PythonWin में चलाया जाता है।sys.path[0]
औरos.path.abspath(os.path.dirname(sys.argv[0]))
स्क्रिप्ट निर्देशिका को वापस करने लगते हैं। मुझे यकीन नहीं है कि इन दोनों के बीच कोई अंतर है।
संपादित करें:
मुझे बस एहसास हुआ कि मैं जो करना चाहता हूं, उसे बेहतर वर्णन किया जाएगा "जिसमें एक फ़ाइल को उसी निर्देशिका में खोलें जिसमें युक्त मॉड्यूल है"। दूसरे शब्दों में, यदि मैं एक मॉड्यूल आयात करता हूं जो मैंने लिखा है कि दूसरी निर्देशिका में है, और वह मॉड्यूल एक फ़ाइल खोलता है, मैं चाहता हूं कि यह मॉड्यूल की निर्देशिका में फ़ाइल की तलाश करे। मुझे नहीं लगता कि मैंने जो कुछ भी पाया है वह ऐसा करने में सक्षम है ...
__file__
उपयोग नहीं किया जा सकता है, तोsys.argv[0]
इसके बजाय का उपयोग करेंdirname(__file__)
। बाकी लोगों को उम्मीद के मुताबिक काम करना चाहिए। मुझे__file__
लाइब्रेरी कोड का उपयोग करना पसंद है ,sys.argv[0]
हो सकता है कि आपके कोड को बिल्कुल भी इंगित न किया जाए, यदि किसी तीसरे पक्ष की स्क्रिप्ट के माध्यम से आयात किया जाता है।