2011-10-17 8 views

उत्तर

6

चेक f.fileno(), यह fi के रूप में ही होना चाहिए। आपको केवल उस फाइल डिस्क्रिप्टर को एक बार बंद करना चाहिए, इसलिए दूसरा सही है।

>>> f.close() 
>>> os.close(fi) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
OSError: [Errno 9] Bad file descriptor 
+0

पकड़ लिया। थोड़ा उलझन में: दो बार खुलें, एक बार बंद करें। लेकिन मुझे लगता है कि – Claudiu

+1

'os.fdopen()' फ़ाइल डिस्क्रिप्टर को जरूरी नहीं है, यह फ़ाइल desciptor के लिए एक खुली फ़ाइल ऑब्जेक्ट देता है। अगर फ़ाइल डिस्क्रिप्टर पहले से ही खुला है तो यह इसे फिर से नहीं खोल पाएगा। –

+0

@ क्लाउडियो: ऐसा इसलिए है क्योंकि ओएस फ़ाइल * डिस्क्रिप्टर * (जो ओएस-स्तरीय ऑब्जेक्ट्स) के बीच एक अंतर बनाता है, और फ़ाइल * स्ट्रीम * (जो libc-level ऑब्जेक्ट्स हैं)। 'fopen' (पायथन में' खुला ') एक वर्णक खोलता है, फिर इस वर्णनकर्ता का उपयोग करके एक स्ट्रीम खोलता है। 'fdopen' मौजूदा डिस्क्रिप्टर का उपयोग करके एक नई स्ट्रीम खोलता है। पायथन में 'fclose' ('file.close') एक स्ट्रीम और इसके अंतर्निहित वर्णनकर्ता को बंद कर देता है। – millimoose

1

मुझे क्या करना होगा::

fi, path = tempfile.mkstemp() 
f = os.fdopen(fi, "w") 
try: 
    f.write(res) 
finally: 
    f.close() 
2

एक पर्याप्त हाल अजगर पर हैं, तो आप कर सकते हैं गोल्फ इस के लिए नीचे:

with os.fdopen(tempfile.mkstemp()[0]) as f: 
    f.write(res) 

यूनिक्स पर, पहले एक त्रुटि का कारण बनता है

+0

हेहे अच्छा है, लेकिन मुझे इस मामले में पथ चाहिए – Claudiu

0

यदि आप अंतिम उदाहरण में लिखने जा रहे हैं तो आपको इसकी आवश्यकता होगी:

with os.fdopen(tempfile.mkstemp()[0], 'w') as f: 
    f.write(res) 
2

, सबसे हाल ही जवाब पर अनुवर्ती को जारी रखते हुए अगर आप पथ की जरूरत है:

f_handle, f_path = tempfile.mkstemp() 
with os.fdopen(f_handle, 'w') as f: 
    f.write(res) 

try: 
    # Use path somehow 
    some_function(f_path) 

finally: 
    # Clean up 
    os.unlink(f_path) 
संबंधित मुद्दे

 संबंधित मुद्दे