2017-01-20 1 views
0

Learning Python the Hard Way (Troisième édition) déclare utiliser Powershell si l'on utilise MS Windows. J'ai téléchargé cygwin dans le but d'émuler un environnement Linux car Zed Shaw déclare que Linux est acceptable.Learning Python the Hard Way (Troisième édition) Exercice 11 déclarations d'impression n'imprimées qu'après entrée est entré

Les 10 premiers exercices ont été exécutés avec succès sans accroc.

Malheureusement, j'ai rencontré un problème avec l'exercice 11 « Poser des questions ».

$ plus ex11.py

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) 

Exécution des instructions d'impression dans les résultats de fichiers .py ne sont imprimées après trois lignes d'entrée sont prévus?

$ python ex11.py

32 
6'2" 
180 lbs 

How old are you? How tall are you? How much do you weigh? So, you're '32' old, '6\'2"' tall and '180 lbs' heavy. 

Curieux.

Pourrait-on être en mesure d'offrir une explication et une solution?

Merci!

-python Débutant

+0

Etes-vous sûr qu'il y a des virgules à la fin des instructions d'impression? – ruaridhw

+0

Votre code fonctionne correctement pour moi, donc le côté Python est correct. Il doit y avoir un problème avec la powershell. Et pourquoi ne pas passer vos questions en tant que paramètres à 'raw_input'?(C'est ainsi qu'ils sont censés être utilisés.) E.g. 'age = raw_input (" Quel âge avez-vous? ")' – DyZ

+0

Désolé, réalisé qu'ils étaient là pour empêcher de nouvelles lignes. Est-ce que quelque chose apparaît si vous exécutez le code et attendez ~ 10s? – ruaridhw

Répondre

0

Je trouve ce poste de débordement de pile qui décrit un symptôme similaire ... raw_input() won't show prompt until after input

La cause est citée comme un problème de mise en mémoire tampon.

Les États qui y sont solution recommandée pour exécuter python en utilisant l'option -u.

Vérification des pages d'aide de python:

$ python -h

...

-u: stdout binaire unbuffered et stderr; aussi PYTHONUNBUFFERED = x voir page de manuel pour plus de détails sur mise en mémoire tampon interne relatives à « -u »

...

avère que semble avoir résolu mon problème aussi bien - au moins à court.

~~~~~~~~~~~~~~~~~

$ python -u ex11.py

Quel âge êtes-vous? 32

Quelle est votre taille? 6'2"

Combien pesez-vous? 180

Alors, vous êtes vieux '32', '6 \' 2" » haut et '180' lourd.

~~~~~~~~~~~~~~~~~

Malheureusement, il semble .. si je veux jamais courir qu'un fichier .py j'utiliser l'option -u . Ce n'est pas comme si le tampon était définitivement effacé. :(

Une autre seconde tentative ultérieure ont donné lieu dans le même problème initial.

$ python de ex11.py

6'2"

Quel âge Êtes-vous? Combien mesurez-vous? Combien pesez-vous? Donc, vous êtes '32' vieux, '6 \' 2 "'grand et' 180 'lourd

~~~~~~~~~~~~~~~~~

Existe-t-il un FIX À LONG TERME?

+0

exercice 12 est similaire dans la nature ~~~~~~~~~~~~~~ $ plus ex12.py age = raw_input ("Quel âge avez-vous?") height = raw_input ("Quelle est votre taille?") weight = raw_input ("Combien pesez-vous?") print "Donc, vous êtes% r,% r tall et% r heavy." % (Âge , taille, poids) ~~~~~~~~~~~~~~ Les résultats étaient les mêmes que ex11.py ~~~~~~~~~~~~ ~~ - c'est-à-dire que l'option python -u devait être spécifique pour qu'elle s'exécute comme prévu. ~~~~~~~~~~~~~~ – Bill

+0

Veuillez [mettre en forme votre code correctement] (http://meta.stackexchange.com/a/22189/248777). – mklement0

0

Au début de chaque Cygwin (bash) session, exécutez:

export PYTHONUNBUFFERED=1 

ou, pour une solution persistante, ajouter cette ligne à votre fichier ~/.bashrc; .: par exemple

echo 'export PYTHONUNBUFFERED=1' >> ~/.bashrc 

Cela vous évite d'avoir à passer -u à l'exécutable python chaque fois, et permet donc invoquer directement *.py fichiers.

Définir variable d'environnement PYTHONUNBUFFERED avec une valeur de 1 et de l'option de ligne de commande -u les deux ont l'effet suivant, qui, comme vous avez découvert, résout votre problème (du v2.7 docs):

force stdin , stdout et stderr pour être totalement unbuffered. Sur les systèmes où cela compte, mettez aussi stdin, stdout et stderr en mode binaire. Notez qu'il existe une mise en mémoire tampon interne dans file.readlines() et File Objects (pour line dans sys.stdin) qui n'est pas influencée par cette option. Pour contourner ce problème, vous devrez utiliser file.readline() dans un while 1: loop.


Note: Cela est nécessaire en raison de votre configuration inhabituelle: combinant Cygwin avec un exécutable de Windowspython (je présume).

En revanche, l'exécution de Windows python à partir d'une invite de commande régulière (cmd.exe) ou une console PowerShell (powershell.exe) serait pas présentent ce problème.