Domanda

Sto cercando di scrivere un semplice strumento che legge i file da un disco, fa un po 'di elaborazione delle immagini, e restituisce il risultato dell'algoritmo. Dal momento che il programma può a volte prendere un po ', mi piace avere una barra di avanzamento così so dove si trova nel programma. E dal momento che non mi piace di ingombrare la mia linea di comando e io sono su una piattaforma Unix, ho voluto utilizzare il carattere '\ r' per stampare la barra di avanzamento su una sola riga.

Ma quando ho questo codice qui, è stampato nulla.


# Files is a list with the filenames
for i, f in enumerate(files):
    print '\r%d / %d' % (i, len(files)),
    # Code that takes a long time

Ho anche provato:


print '\r', i, '/', len(files),

Ora solo per assicurarsi che questo ha funzionato in python, ho provato questo:


heartbeat = 1
while True:
    print '\rHello, world', heartbeat,
    heartbeat += 1

Questo codice funziona perfettamente. Cosa sta succedendo? La mia comprensione dei ritorni a capo su Linux era che sarebbe solo spostare il carattere di avanzamento linea all'inizio e poi ho potuto sovrascrivere vecchio testo che è stato scritto in precedenza, finché io non stampare l'ovunque nuova riga. Questo non sembra accadere però.

Inoltre, c'è un modo migliore per visualizzare una barra di avanzamento in una riga di comando di quello che sto cercando di fare corrente?

È stato utile?

Soluzione

Prova ad aggiungere sys.stdout.flush() dopo l'istruzione print. E 'possibile che non sia print vampate di calore l'uscita fino a quando non scrive una nuova riga, che non accade qui.

Altri suggerimenti

Movimentazione di ritorni a capo in Linux differisce notevolmente tra terminali emulatori.

normalmente si userà codici di escape del terminale che dire l'emulatore di terminale per spostare il "trasporto" virtuale sullo schermo (si pensi programmi a schermo intero esecuzione su linee BBS). Quelli che sono a conoscenza di sono i codici di escape VT100:

\e[A: fino
\e[B:
giù \e[C:
destra \e[D: sinistro
\e[1~: casa
\e[4~: end

Dove \e è il carattere di escape, \x1b.

Provare a sostituire tutti di \r con \e[1~

Si veda anche questo post

Se il terminale è la linea-buffered, potrebbe essere necessario un sys.stdout.flush() per vedere la stampa se non si emette un avanzamento riga.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top