Come svuotare l'output della stampa Python?
Suggerisco cinque modi per farlo:
- In Python 3, chiama
print(..., flush=True)
(l'argomento flush non è disponibile nella funzione di stampa di Python 2 e non esiste un analogo per l'istruzione print).
- Richiamare
file.flush()
il file di output (per fare ciò possiamo avvolgere la funzione di stampa di python 2), ad esempio,sys.stdout
- applicarlo a ogni chiamata della funzione di stampa nel modulo con una funzione parziale,
print = partial(print, flush=True)
applicata al modulo globale.
- applicare questo al processo con un flag (
-u
) passato al comando interprete
- applicalo a ogni processo Python nel tuo ambiente con
PYTHONUNBUFFERED=TRUE
(e disattiva la variabile per annullare ciò).
Python 3.3+
Usando Python 3.3 o versioni successive, puoi semplicemente fornire flush=True
come argomento una parola chiave alla print
funzione:
print('foo', flush=True)
Python 2 (o <3.3)
Non hanno eseguito il backport flush
dell'argomento su Python 2.7 Quindi, se si utilizza Python 2 (o meno di 3.3) e si desidera un codice compatibile con 2 e 3, posso suggerire il seguente codice di compatibilità. (Nota che l' __future__
importazione deve essere in / molto "vicino alla parte superiore del modulo "):
from __future__ import print_function
import sys
if sys.version_info[:2] < (3, 3):
old_print = print
def print(*args, **kwargs):
flush = kwargs.pop('flush', False)
old_print(*args, **kwargs)
if flush:
file = kwargs.get('file', sys.stdout)
# Why might file=None? IDK, but it works for print(i, file=None)
file.flush() if file is not None else sys.stdout.flush()
Il codice di compatibilità di cui sopra coprirà la maggior parte degli usi, ma per un trattamento molto più approfondito, consultare il six
modulo .
In alternativa, puoi semplicemente chiamare file.flush()
dopo la stampa, ad esempio, con l'istruzione print in Python 2:
import sys
print 'delayed output'
sys.stdout.flush()
Modifica del valore predefinito in un modulo in flush=True
È possibile modificare il valore predefinito per la funzione di stampa utilizzando functools.partial nell'ambito globale di un modulo:
import functools
print = functools.partial(print, flush=True)
se guardi la nostra nuova funzione parziale, almeno in Python 3:
>>> print = functools.partial(print, flush=True)
>>> print
functools.partial(<built-in function print>, flush=True)
Possiamo vedere che funziona come al solito:
>>> print('foo')
foo
E possiamo effettivamente sostituire il nuovo predefinito:
>>> print('foo', flush=False)
foo
Nota di nuovo, questo cambia solo l'ambito globale corrente, perché il nome di stampa sull'ambito globale corrente oscurerà la print
funzione incorporata (o annullerà il riferimento alla funzione di compatibilità, se ne usi una in Python 2, in quell'ambito globale corrente).
Se vuoi farlo all'interno di una funzione anziché nell'ambito globale di un modulo, dovresti dargli un nome diverso, ad esempio:
def foo():
printf = functools.partial(print, flush=True)
printf('print stuff like this')
Se lo dichiarate globale in una funzione, lo state cambiando nello spazio dei nomi globale del modulo, quindi dovreste semplicemente inserirlo nello spazio dei nomi globale, a meno che quel comportamento specifico sia esattamente quello che volete.
Modifica del valore predefinito per il processo
Penso che l'opzione migliore qui sia usare la -u
bandiera per ottenere un output senza buffer.
$ python -u script.py
o
$ python -um package.module
Dai documenti :
Forza lo stdin, lo stdout e lo stderr ad essere totalmente senza buffer. Sui sistemi in cui è importante, metti anche stdin, stdout e stderr in modalità binaria.
Si noti che esiste un buffering interno in file.readlines () e Oggetti file (per la riga in sys.stdin) che non è influenzato da questa opzione. Per ovviare a questo, ti consigliamo di utilizzare file.readline () all'interno di un ciclo while 1:.
Modifica del valore predefinito per l'ambiente operativo della shell
È possibile ottenere questo comportamento per tutti i processi Python nell'ambiente o negli ambienti che ereditano dall'ambiente se si imposta la variabile di ambiente su una stringa non vuota:
ad esempio, in Linux o OSX:
$ export PYTHONUNBUFFERED=TRUE
o Windows:
C:\SET PYTHONUNBUFFERED=TRUE
dai documenti :
PYTHONUNBUFFERED
Se è impostato su una stringa non vuota, equivale a specificare l'opzione -u.
appendice
Ecco la guida sulla funzione di stampa da Python 2.7.12 - Si noti che non v'è alcun flush
argomento:
>>> from __future__ import print_function
>>> help(print)
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
__future__
versione non includeflush
perché "l'argomento flush è stato aggiunto in Python 3.3 (dopo che print () è stato riportato in 2.7 tramite un'importazione futura)" bugs.python.org/issue28458