2010-07-02 11 views
142
  1. पाइथन कितनी बार फाइल में फ्लश करता है?
  2. पाइथन कितनी बार स्टडआउट करने के लिए फ्लश करता है?

मुझे यकीन है कि (1)।पाइथन कितनी बार फाइल में फ्लश करता है?

के लिए (2), मेरा मानना ​​है कि पाइथन हर नई लाइन के बाद stdout करने के लिए flushes। लेकिन, अगर आप फ़ाइल में होने के लिए stdout अधिभार करते हैं, तो क्या यह अक्सर फ्लश करता है?

उत्तर

223

फ़ाइल संचालन के लिए, अजगर ऑपरेटिंग सिस्टम के डिफ़ॉल्ट बफरिंग का उपयोग करता है जब तक आप इसे अन्यथा कॉन्फ़िगर होगा। आप एक बफर आकार, unbuffered, या लाइन buffered निर्दिष्ट कर सकते हैं।

उदाहरण के लिए, खुले फ़ंक्शन में बफर आकार तर्क होता है। 0 unbuffered मतलब है, 1 लाइन बफ़र का मतलब है, किसी भी अन्य सकारात्मक मूल्य (लगभग) है कि आकार के एक बफर का उपयोग का मतलब है एक नकारात्मक बफरिंग साधन:

http://docs.python.org/library/functions.html#open

"वैकल्पिक बफरिंग तर्क फ़ाइल के वांछित बफर आकार निर्दिष्ट करता है। सिस्टम डिफ़ॉल्ट, जो आमतौर पर लाइन tty उपकरणों के लिए बफ़र और पूरी तरह से अन्य फ़ाइलों के लिए बफ़र है उपयोग करने के लिए। यदि छोड़ा जाता है, सिस्टम डिफ़ॉल्ट प्रयोग किया जाता है। "

bufsize = 0 
f = open('file.txt', 'w', bufsize) 
+11

द्वारा +1 "लाइन बफ़र" भाग के लिए प्रतिलिपि बनाई गई थी। यही वही है जो मैं खोज रहा था और यह एक आकर्षण की तरह काम करता है। – rein

+0

पायथन 3.4.3 का उपयोग करते समय जब मैं 'खोलता हूं' (file.txt ',' w ', 1)' मुझे उचित रेखा बफरिंग मिलती है। लेकिन अगर मैं कुछ भी बड़ा करता हूं (मैं चाहता था कि 'ओपन (' file.txt ',' w ', 512) ') यह 8192 के पूर्ण' io.DEFAULT_BUFFER_SIZE' को बफर करता है। क्या यह एक पायथन बग, एक लिनक्स बग, या एक ID10t बग? –

11

मुझे नहीं पता कि यह पाइथन पर भी लागू होता है, लेकिन मुझे लगता है कि यह आपके द्वारा चल रहे ऑपरेटिंग सिस्टम पर निर्भर करता है।

उदाहरण के लिए लिनक्स पर, टर्मिनल पर आउटपुट बफर को एक नई लाइन पर फहराता है, जबकि फाइलों के आउटपुट के लिए केवल बफर भरने पर ही फ्लश होता है (डिफ़ॉल्ट रूप से)। ऐसा इसलिए है क्योंकि बफर को कम समय में फ्लश करना अधिक कुशल होता है, और उपयोगकर्ता को नोटिस करने की संभावना कम होती है कि फ़ाइल में किसी नई लाइन पर आउटपुट फ़्लश नहीं किया जाता है।

यदि आप की जरूरत है तो आप आउटपुट को ऑटो-फ्लश करने में सक्षम हो सकते हैं।

संपादित करें: मुझे लगता है आप अजगर में ऑटो-फ्लश इस तरह से (here से आधारित )

#0 means there is no buffer, so all output 
#will be auto-flushed 
fsock = open('out.log', 'w', 0) 
sys.stdout = fsock 
#do whatever 
fsock.close() 
107

तुम भी फ्लश बफर एक फाइल करने के लिए प्रोग्राम के रूप में मजबूर कर सकते हैंके साथविधि।

with open('out.log', 'w+') as f: 
    f.write('output is ') 
    # some work 
    s = 'OK.' 
    f.write(s) 
    f.write('\n') 
    f.flush() 
    # some other work 
    f.write('done\n') 
    f.flush() 

मैं जब tail -f साथ कोई आउटपुट फ़ाइल पीछा इस उपयोगी पाया है।

+23

दस्तावेज़ों से: 'नोट: फ्लश() फ़ाइल के डेटा को डिस्क पर जरूरी नहीं लिखता है। इस व्यवहार को सुनिश्चित करने के लिए os.fsync() के बाद flush() का उपयोग करें। – bobismijnnaam

+10

इस उदाहरण में आदेश 'os.fsync (f.fileno()) ' – juanmah

+0

@bobismijnnaam अगली बार कहा गया दस्तावेज़ों से लिंक है। केवल संदर्भ जो मैं पा सकता हूं वह https://github.com/jprzywoski/python-reference/blob/master/source/docs/file/flush.rst से है और मुझे नहीं पता कि वह कौन है। –

7

आप io मॉड्यूल से केवल DEFAULT_BUFFER_SIZE विशेषता को पढ़ने के द्वारा डिफ़ॉल्ट बफर आकार भी देख सकते हैं।

import io 
print (io.DEFAULT_BUFFER_SIZE) 
0

यह एक और दृष्टिकोण है, ओपी तक यह चुनने के लिए कि वह कौन सा पसंद करता है।

जब किसी अन्य कोड से पहले __init__ .py फ़ाइल में नीचे दिए गए कोड सहित, संदेश print के साथ मुद्रित और किसी भी त्रुटि नहीं रह Ableton के log.txt के लिए, लेकिन अपनी डिस्क पर अलग फ़ाइलों को लॉग इन किया जाएगा:

import sys 

path = "/Users/#username#" 

errorLog = open(path + "/stderr.txt", "w", 1) 
errorLog.write("---Starting Error Log---\n") 
sys.stderr = errorLog 
stdoutLog = open(path + "/stdout.txt", "w", 1) 
stdoutLog.write("---Starting Standard Out Log---\n") 
sys.stdout = stdoutLog 

(मैक के लिए, अपने उपयोगकर्ता फ़ोल्डर के नाम पर #username# बदलें।विंडोज़ पर आपके उपयोगकर्ता फ़ोल्डर के पथ का एक अलग प्रारूप होगा)

जब आप किसी टेक्स्ट एडिटर में फ़ाइलों को खोलते हैं जो डिस्क पर फ़ाइल बदलते समय अपनी सामग्री को रीफ्रेश करता है (मैक के लिए उदाहरण: TextEdit टेक्स्ट टेक्स्ट नहीं करता है) , आप रीयल-टाइम में अपडेट किए जा रहे लॉग देखेंगे।

क्रेडिट: इस कोड को ज्यादातर liveAPI नियंत्रण सतह स्क्रिप्ट से नाथन Ramella

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