2010-07-02 15 views
142
  1. Python bir dosyaya ne sıklıkla akıyor?
  2. Python hangi sıklıkla stdout'a akıyor?

Emin değilim (1).Python bir dosyaya ne sıklıkla akıyor?

(2) 'ye gelince, her yeni hattan sonra Python'un stdout'a aktığına inanıyorum. Ancak, stdout'u bir dosyaya yüklemek için aşırı yüklerseniz, sık sık yıkıyor mu?

cevap

223

, Python işletim sisteminin varsayılan arabelleğe kullanır olur düşünüyorum. Bir arabellek boyutu, arabelleğe alınmamış veya satır arabelleği belirtebilirsiniz. Örneğin, açık işlev arabellek boyutu bağımsız değişkenini alır. 0 tamponsuz anlamına , 1 satır tamponlu anlamına gelir, diğer herhangi bir pozitif değer (yaklaşık) bu boyuttaki bir tampon kullanımı anlamına gelir Negatif bir tamponlama aracı:

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

"İsteğe bağlı tampon argüman dosyanın istenilen tampon boyutu belirtir. genellikle hat Tty cihazlar için tamponlu ve tam diğer dosyalar için tamponlu sistem varsayılan kullanmak. atlanırsa, sistem varsayılan kullanılır. "

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

+ 1 ile liveAPI kontrol yüzeyi komut dosyaları çoğunlukla kopyalanmıştır. Tam olarak aradığım şey bu ve çekicilik gibi çalışıyor. – rein

+0

Python'u kullanma 3.4.3 'açtığımda (' file.txt ',' w ', 1) 'Doğru satır aramasını elde ediyorum. Ama eğer daha büyük bir şey yaparsam ('open (' file.txt ',' w ', 512) ') istediyse, 8192'nin tamamını' io.DEFAULT_BUFFER_SIZE 'olarak tamponlar. Bu bir Python hatası mı, bir Linux hatası mıdır, yoksa bir ID10t hatası? –

11

Bunun python için de geçerli olup olmadığını bilmiyorum, ancak çalıştığınız işletim sistemine bağlı olduğunu düşünüyorum.

Linux'ta, örneğin, terminal için çıkış arabelleği bir satırsonunda temizler, buna karşılık dosyalara çıktı için yalnızca arabellek dolduğunda (varsayılan olarak) akar. Bunun nedeni, arabelleği daha az kez temizlemenin daha verimli olması ve kullanıcının bir dosyadaki yeni satırda temizlenmemesi durumunda kullanıcının daha az fark etmesidir.

İhtiyacınız olan şey varsa, çıkışı otomatik olarak temizleyebilirsiniz.

DÜZENLEME: Ben Python otomatik sifon (here den alınarak) bu şekilde bunu başka türlü yapmak yapılandırmak sürece dosya işlemleri için

#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

programatik olarak da bir dosyaya floş tampon zorlayabilirilemetodu. tail -f ile bir çıkış dosyasında atık zaman

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() 

Ben bu yararlı bulduk.

+23

Dokümanlar: 'Not: flush(), dosyanın verilerini diske yazmaz. Bu davranışı sağlamak için flush() öğesini ve ardından os.fsync() öğesini kullanın. ' – bobismijnnaam

+10

Bu örnekte, komut, söz konusu dokümanlara bir dahaki sefere "os.fsync (f.fileno())" – juanmah

+0

@bobismijnnaam'dır. Sadece referans bulabilirim https://github.com/jprzywoski/python-reference/blob/master/source/docs/file/flush.rst ve kim olduğunu bilmiyorum. –

7

Ayrıca, io modülünden salt okunur DEFAULT_BUFFER_SIZE özniteliğini çağırarak varsayılan arabellek boyutunu da kontrol edebilirsiniz.

import io 
print (io.DEFAULT_BUFFER_SIZE) 
0

İşte hangisini tercih edeceğini seçmek için OP'e kadar olan başka bir yaklaşım.

önce başka bir kodu __init__ .py dosyasında aşağıdaki kodu dahil

, mesajlar print ile basılmış ve herhangi bir hata artık Ableton en Log.txt ancak diskte ayrı dosyalara kaydedilir:

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 

(Mac için, kullanıcı klasörünüzün adına #username# değiştirin.Windows'ta, kullanıcı klasörünüzün yolu farklı bir biçime sahip olacaktır)

Dosyaları, diskteki dosya değiştirilirken içeriğini yenileyecek bir metin düzenleyicisinde açtığınızda (Mac için örnek: TextEdit, TextWrangler yapmaz) , gerçek zamanlı olarak güncellenen günlükleri göreceksiniz.

Kredi: bu kod "hat tamponlu" bir kısmı, Nathan Ramella

İlgili konular