2015-04-21 7 views
21

Ipython Notebook non sembra stampare i risultati in tempo reale, ma sembra bufferizzare in un determinato modo e quindi stampare in blocco le stampe. Come posso fare in modo che ipython stampi i miei risultati non appena viene elaborato il comando di stampa?Realizza la stampa del taccuino ipython in tempo reale

codice Esempio:

import time 


def printer(): 
    for i in range(100): 
     time.sleep(5) 
     print i 

Supponendo che il codice di cui sopra è in un file che viene importato. Come posso far sì che quando chiamo la funzione della stampante stampi un numero ogni 5 secondi e non tutti i numeri alla fine?

Si prega di notare che non posso modificare la funzione printer() perché ottengo da qualche modulo esterno. Voglio che cambi le configurazioni del notebook ipython in qualche modo in modo che non usi un buffer. Pertanto, non desidero nemmeno usare sys.stdout.flush(), voglio farlo in tempo reale in base alla domanda, non voglio che inizi il buffer.

Ho anche provato il caricamento di ipython notebook con il comando:

ipython notebook --cache-size=0 

ma che anche non sembra funzionare.

+0

Grazie. La mia domanda è leggermente diversa. Non voglio cambiare la funzione printer() perché ottengo l'importazione di un modulo che non voglio modificare. Voglio semplicemente cambiare il comportamento di ipython. Quindi le soluzioni proposte nella domanda sopra non funzionano per me perché non posso aggiungere sys.stdout.flush() alla funzione. Quello che voglio è che non ci sia buffer nel notebook ipython. Che emette automaticamente tutto. –

+2

È possibile monitorare la funzione della stampante. – syntonym

+0

Forse, ma ci dovrebbe essere un modo per annullare lo stdout del notebook ipython no? –

risposta

4

Dal Python 3.3, print() ha un argomento additional flush che può essere utilizzato per forzare vampate di calore:

for i in range(10): 
    print(i, flush=True) 
    time.sleep(1) 
14

Questo è semplicemente one of the answers alla domanda suggerita dal Carsten incorporando delegazione __getattr__ suggerita da diedthreetimes in un commento:

import sys 
oldsysstdout = sys.stdout 
class flushfile(): 
    def __init__(self, f): 
     self.f = f 
    def __getattr__(self,name): 
     return object.__getattribute__(self.f, name) 
    def write(self, x): 
     self.f.write(x) 
     self.f.flush() 
    def flush(self): 
     self.f.flush() 
sys.stdout = flushfile(sys.stdout) 

Nella risposta originale, il metodo __getattr__ non è implementato. Senza di ciò, fallisce. Altre varianti nelle risposte a questa domanda falliscono anche in un notebook.

In un notebook, sys.stdout è un'istanza di IPython.kernel.zmq.iostream.OutStream e ha un numero di metodi e attributi non presenti nel solito sys.stdout. La delega __getattr__ consente a un flushfile di mascherarsi come anatra ...zmq.iostream.OutStream.

Questo funziona in un pitone 2.7 run notebook con ipython 3.1.0

+0

È un bel problema, ma grazie! Lo proverò. –

+0

Funziona !! :) Grazie! Attribuirò la taglia in 2 giorni. –

+1

È ancora la soluzione migliore per Jupyter? – czxttkl