2013-02-23 9 views
24

में os.open और os.fdopen के बीच अंतर मैं वास्तव में os.open का उपयोग करें और जब जब उपयोग करने के लिए os.fdopenक्या अजगर

मैं os.open के साथ अपने सभी काम कर रहा था उलझन में हूँ और यह किसी भी समस्या है, लेकिन मैं बिना काम किया है किन स्थितियों और dup और fsync

जैसे अन्य सभी कार्यों हम जरूरत file descriptors तहत समझने में सक्षम नहीं हूँ file descriptor

से file object अलग है मेरा मतलब f = os.open("file.txt",w)

अब फ़ाइलबोजेक्ट या इसके दायरलेखक है?

+0

करने के लिए [डॉक्स] (http अनुसार: //docs.python.org/2/library/os.html#os.open), os.open() एक फ़ाइल डिस्क्रिप्टर देता है, जबकि बिल्टिन ओपन() एक फ़ाइल ऑब्जेक्ट देता है। – Octipi

उत्तर

41

आप भ्रमित कर रहे हैं में निर्मित os मॉड्यूल द्वारा प्रदान की os.open() साथ open() कार्य करते हैं। वे काफी अलग हैं; os.open(filename, "w") वैध पायथन नहीं है (os.open इसके दूसरे तर्क के रूप में पूर्णांक ध्वज स्वीकार करता है), open(filename, "w") है।

संक्षेप में, open() नई फ़ाइल वस्तुओं बनाता है, os.open() बनाता ओएस-स्तर फ़ाइल वर्णनकर्ता, और os.fdopen() एक फ़ाइल वर्णनकर्ता के बाहर एक फ़ाइल वस्तु बनाता है।

फ़ाइल डिस्क्रिप्टर सीधे ऑपरेटिंग सिस्टम कर्नेल द्वारा प्रदान की गई फ़ाइलों के साथ काम करने के लिए निम्न स्तर की सुविधा हैं। एक फ़ाइल डिस्क्रिप्टर एक छोटा पूर्णांक होता है जो प्रत्येक प्रक्रिया के लिए कर्नेल द्वारा रखी गई खुली फ़ाइलों की एक तालिका में खुली फ़ाइल की पहचान करता है। कई सिस्टम कॉल फ़ाइल डिस्क्रिप्टर स्वीकार करते हैं, लेकिन वे काम करने के लिए सुविधाजनक नहीं हैं, आमतौर पर निश्चित-चौड़ाई वाले बफर की आवश्यकता होती है, कुछ स्थितियों में एकाधिक रीट्रीज़ और मैन्युअल त्रुटि हैंडलिंग की आवश्यकता होती है।

फ़ाइल ऑब्जेक्ट्स पाइथन कक्षाएं हैं जो फ़ाइलों के साथ काम करने के लिए फाइल डिस्क्रिप्टर को अधिक सुविधाजनक और कम त्रुटि-प्रवण बनाती हैं। वे उदाहरण के लिए, त्रुटि-हैंडलिंग, बफरिंग, लाइन-बाय-लाइन रीडिंग, वर्णसेट रूपांतरण प्रदान करते हैं, और कचरा इकट्ठा होने पर बंद होते हैं।

पुनरावृत्ति करने के लिए:

  • निर्मित open() एक फ़ाइल नाम लेता है और एक नया अजगर फ़ाइल वस्तु देता है। अधिकांश मामलों में आपको यही चाहिए।

  • os.open() फ़ाइल का नाम लेता है और एक नया फ़ाइल डिस्क्रिप्टर देता है। इस फ़ाइल डिस्क्रिप्टर को नीचे दिए गए अनुसार निम्न निम्न-स्तरीय फ़ंक्शंस जैसे os.read() और os.write(), या os.fdopen() पर पारित किया जा सकता है। आपको कोड लिखते समय केवल इसकी आवश्यकता होती है जो ऑपरेटिंग-सिस्टम-निर्भर API पर निर्भर करता है, जैसे O_EXCLopen(2) पर ध्वज का उपयोग करना।

  • os.fdopen() किसी मौजूदा फ़ाइल वर्णनकर्ता लेता है - आम तौर पर इस तरह के pipe() या dup() के रूप में यूनिक्स प्रणाली कॉल द्वारा उत्पादित, और इसके चारों ओर एक अजगर फ़ाइल वस्तु बनाता है। प्रभावी रूप से यह एक फ़ाइल डिस्क्रिप्टर को एक पूर्ण फ़ाइल ऑब्जेक्ट में परिवर्तित करता है, जो सी कोड या एपीआई के साथ इंटरफेसिंग करते समय उपयोगी होता है जो केवल निम्न-स्तर फ़ाइल डिस्क्रिप्टर बनाते हैं।

निर्मित openos.open() (एक फ़ाइल विवरणक बनाने के लिए) का उपयोग कर लागू किया जा सकता और os.fdopen() (एक फ़ाइल वस्तु में लपेट के लिए):

# equivalent to open(filename, "r") 
f = os.fdopen(os.open(filename, os.O_RDONLY)) 
+0

आप सही हैं, मैं 'ओपन' और 'os.open() 'से उलझन में था। क्या आप मुझे कुछ कोड उदाहरण दे सकते हैं, जहां मैं सामान्य 'ओपन' द्वारा कुछ संभव नहीं करने के लिए 'fd' का उपयोग कर सकता हूं। मैं जानना चाहता हूं कि यह कैसे काम करता है – user1994660

+0

@ user1994660 जैसा कि मैंने उत्तर में कहा था, आप 'ओ_एक्ससीएल' या अन्य सिस्टम-विशिष्ट झंडे को 'ओपन() 'में निर्मित नहीं कर सकते हैं। 'Os.fdopen()' के रूप में, यूनिक्स एपीआई जैसे 'पाइप() ',' dup() ', आदि सभी रिटर्न फाइल डिस्क्रिप्टर, फाइल ऑब्जेक्ट्स नहीं। उस स्थिति में आप इस ऑब्जेक्टर्स को फ़ाइल ऑब्जेक्ट्स में कनवर्ट करने के लिए 'os.fdopen' का उपयोग करेंगे। – user4815162342