2010-07-02 19 views
142
  1. Con quale frequenza Python scarica un file?
  2. Con quale frequenza Python scarica lo stdout?

Non sono sicuro di (1).Con quale frequenza Python scarica un file?

Per quanto riguarda (2), credo che Python svuota lo stdout dopo ogni nuova riga. Ma se sovraccarichi lo stdout in un file, lo svuota più spesso?

risposta

223

Per le operazioni sui file, Python usa il buffer di default del sistema operativo a meno che non lo si configura fare altrimenti. È possibile specificare una dimensione del buffer, unbuffered o line buffer.

Ad esempio, la funzione di apertura accetta un argomento di dimensione del buffer.

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

"L'argomento buffer opzionale specifica dimensione del buffer desiderato del file: 0 significa senza buffer, 1 significa linea tamponata, qualsiasi altro valore positivo significa utilizzare un buffer di (circa) che taglia Un mezzo tampone negativi. per utilizzare il default del sistema, che di solito è la linea tamponato per dispositivi tty e fully-buffered per gli altri file. Se omesso, il default del sistema viene utilizzato. "

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

+1 per la parte "linea tamponata". Questo è esattamente quello che stavo cercando e funziona come un fascino. – rein

+0

Utilizzando Python 3.4.3 quando eseguo 'open ('file.txt', 'w', 1)' Ricevo il buffering di riga corretto. Ma se faccio qualcosa di più grande (volevo 'open ('file.txt', 'w', 512)') bufferizza l'intero 'io.DEFAULT_BUFFER_SIZE' di 8192. È un bug Python, un bug di Linux o un Bug ID10t? –

11

Non so se questo vale anche per Python, ma penso che dipenda dal sistema operativo che si sta utilizzando.

Su Linux, ad esempio, l'output sul terminale svuota il buffer su una nuova riga, mentre per l'output su file viene svuotato solo quando il buffer è pieno (per impostazione predefinita). Questo perché è più efficiente svuotare il buffer meno volte e l'utente è meno probabile che noti se l'output non viene scaricato su una nuova riga in un file.

Potrebbe essere possibile eseguire il flush automatico dell'output se questo è ciò che è necessario.

EDIT: Penso che si sarebbe auto-flush in python questo modo (basato da 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

si può anche forzare svuotare il buffer in un file di programmazione con ilMetodo

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

Ho trovato questo utile quando tailing un file di output con tail -f.

+23

Dalla documentazione: 'Nota: flush() non scrive necessariamente i dati del file sul disco. Utilizzare flush() seguito da os.fsync() per garantire questo comportamento. – bobismijnnaam

+10

In questo esempio il comando è 'os.fsync (f.fileno())' – juanmah

+0

@bobismijnnaam collegamento successivo a detti documenti. L'unico riferimento che posso trovare è https://github.com/jprzywoski/python-reference/blob/master/source/docs/file/flush.rst e non so chi sia. –

7

È anche possibile controllare la dimensione del buffer predefinita richiamando l'attributo DEFAULT_BUFFER_SIZE di sola lettura dal modulo io.

import io 
print (io.DEFAULT_BUFFER_SIZE) 
0

Ecco un altro approccio, fino all'OP per scegliere quale preferisce.

Quando compreso il codice qui sotto nel file .py __init__ prima di qualsiasi altro codice, messaggi stampati con print e gli eventuali errori non saranno più registrati in Log.txt di Ableton, ma di file separati sul disco:

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 

(per Mac, modificare #username# sul nome della cartella utente.Su Windows il percorso della cartella utente avrà un formato diverso)

Quando si aprono i file in un editor di testo che aggiorna il contenuto quando il file su disco viene modificato (esempio per Mac: TextEdit non fa altro che TextWrangler) , vedrai i log aggiornati in tempo reale.

Considerazioni: questo codice è stato copiato principalmente dagli script superficie di controllo liveAPI da Nathan Ramella

Problemi correlati