2016-01-08 10 views
5

Piattaforma: Git bash MINGW64, Windows 7, 64 CMD Quando si esegue un codice Python da Learn Python The Hard Way ex11. Il codice è semplice.Cmd e Git bash hanno un risultato diverso quando si esegue un codice Python

print "How old are you?", 
age = raw_input() 
print "How tall are you?", 
height = raw_input() 
print "How much do you weigh?", 
weight = raw_input() 

print "So, you're %r old, %r tall and %r heavy." % (
    age, height, weight) 

Ma hanno un risultato diverso in CMD e Git bash. Quando lo eseguo usando Git bash, raw_print() verrà eseguito per primo.

Quando si inseriscono 3 risposte, alla fine verrà visualizzata la stampa 4. Quando lo eseguo in CMD, mostra normalmente, una stampa, una raw_input().

Qualcuno può spiegarlo?

MODIFICA: In realtà, il mio obiettivo è spiegare il motivo, non risolvere questo problema con il colore. Quindi è diverso con this question

+0

Eventuali duplicati di [Come lavare l'uscita di Python stampa?] (Http://stackoverflow.com/questions/230751/how-to-flush-output-of-python-print) –

+1

@KevinGuan I l'ho modificato In realtà, il mio obiettivo è spiegare la ragione, non risolvere questo problema con il colore. Quindi è diverso con un'altra domanda. La modalità di buffering del rispondente MitchPomery ha colpito la chiave. – naifan

risposta

8

Quindi ho dato un'occhiata a questo e ho provato un paio di modi diversi di scrivere quello che hai lì, e tutti hanno agito allo stesso modo. Scavando di più in esso mi sono imbattuto in https://code.google.com/p/mintty/issues/detail?id=218. La chiave da questa è la risposta di andy.koppe:

La chiave del problema è che la modalità di buffer di default di stdout dipende dal tipo di dispositivo: unbuffered per una console, bufferizzata per una pipe. Ciò significa che in una console l'output apparirà immediatamente, mentre in zecca apparirà solo una volta che il buffer sarà pieno o svuotato, come accade alla fine di main().

La console di Windows stampa il testo sullo schermo il prima possibile, mentre mingw (git bash) attenderà fino a quando l'applicazione non gli chiederà di aggiornare lo schermo.

Quindi, per fare in modo che si comportino allo stesso modo in entrambi, è necessario svuotare il buffer sullo schermo dopo ogni stampa. How to flush output of Python print? ha informazioni su come fare questo, ma si tratta di quanto segue:

import sys 

print "How old are you?" 
sys.stdout.flush() 
age = raw_input() 
print "How tall are you?" 
sys.stdout.flush() 
height = raw_input() 
print "How much do you weigh?" 
sys.stdout.flush() 
weight = raw_input() 

print "So, you're %r old, %r tall and %r heavy." % (age, height, weight) 

In alternativa è possibile eseguirlo in MinGW usando il comando -u, che si fermerà pitone da buffer di uscita in MinGW.

python -u file.py 
+2

Thx. Ha risolto il mio problema. La modalità di buffering. – naifan