2017-01-20 12 views
0

Изучение Python на жестком пути (третье издание) означает использование Powershell, если вы используете MS Windows.Изучение Python на жестком пути (третье издание) Упражнение 11 Операции печати не печатаются до ввода ввода

Я загрузил cygwin, чтобы подражать среде linux, поскольку Zed Shaw утверждает, что Linux является приемлемым.

Первые 10 упражнений были успешно выполнены без заминки.

К сожалению, у меня возникла проблема с Упражнением 11 «Задаваемые вопросы».

$ подробнее 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) 

Запуск результатов .py файлов в операторах печати только после того напечатанных три строки ввода предусмотрены?

$ питон 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. 

Любопытный.

Может ли кто-нибудь предложить объяснения и решение?

Спасибо!

-Python Новичок

+0

Уверены ли вы, что в конце заявлений на печать есть запятые? – ruaridhw

+0

Ваш код работает правильно для меня, поэтому сторона Python в порядке. Должна быть какая-то проблема с powershell. И почему бы не передать ваши вопросы в качестве параметров 'raw_input'?(Вот как они должны использоваться). 'age = raw_input (« Сколько вам лет? »)' – DyZ

+0

Извините, они поняли, что они были там, чтобы предотвратить появление новых линий. Что-нибудь появляется, если вы выполняете код и ждете ~ 10 секунд? – ruaridhw

ответ

0

Я нашел этот стека переполнения пост, который описывает подобный симптом ... raw_input() won't show prompt until after input

Причина в нем цитируется как проблема буферизации.

Рекомендованное решение в нем указывает на запуск python с использованием опции -u.

Проверка питон страницы справки:

$ питон -h

...

-u: небуферизован двоичный стандартный вывод и stderr; также PYTHONUNBUFFERED = х см для уточнения деталей по внутренней буферизации, касающихся «-u»

...

Оказывается, что, как представляется, исправили мою проблему, а также - по крайней мере, в краткосрочной перспективе.

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

$ питона -u ex11.py

Сколько вам лет? 32

Сколько у вас рост? 6'2"

Сколько вы весите? 180

Таким образом, вы '32' старые '6 \' 2" »высокий и '180' тяжелый.

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

К сожалению, .. он появляется, если я когда-нибудь хочу, чтобы запустить этот один файл .py я должен использовать опцию -u , Это не похоже на то, что буфер был окончательно очищен. :(

Еще одна попытка несколько секунд спустя в результате одной и той же исходной задачи.

$ питон ex11.py

6'2"

Сколько лет ты такой высокий, сколько ты весишь? Итак, ты «32», «6», «высокий» и «180» тяжелый.

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

Есть ли ДОЛГОСРОЧНОЕ ПОКУПКА?

+0

Упражнение 12 аналогичен по своей природе ~~~~~~~~~~~~~~ $ более ex12.py возраст = raw_input ("Сколько тебе лет?") высота = raw_input («Как вы росли?») weight = raw_input («Сколько вы весите?») print «Итак, вы% r старый,% r высокий и% r тяжелый». % ( возраст, рост, вес) ~~~~~~~~~~~~~~ Результаты были такими же, как ex11.py ~~~~~~~~~~~~ ~~ - то есть параметр python -u должен быть конкретным, чтобы он работал как ожидалось. ~~~~~~~~~~~~~ – Bill

+0

Пожалуйста, [отформатируйте свой код надлежащим образом] (http://meta.stackexchange.com/a/22189/248777). – mklement0

0

В начале каждого (bash) сессии Cygwin, запустите:

export PYTHONUNBUFFERED=1 

или, для постоянного решения, добавьте эту строку в файл ~/.bashrc; например .:

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

Это избавляет вас от необходимости проходить -u к python исполняемом каждый раз, и, следовательно, обеспечивает прямой вызов *.py файлов.

Определение переменной среды PYTHONUNBUFFERED со значением 1 и опции командной строки -u оба имеют следующий эффект, который, как вы обнаружили, решает проблему (от v2.7 docs):

Force STDIN , stdout и stderr полностью не загружены. В системах, где это имеет значение, также ставьте stdin, stdout и stderr в двоичном режиме.

Обратите внимание, что внутри file.readlines() и File Objects (для строки в sys.stdin) есть внутренняя буферизация, на которую не влияет эта опция. Чтобы обойти это, вы захотите использовать file.readline() внутри a 1: loop.


Примечание: Это необходимо только из-за своей необычной установки: сочетающей Cygwin с Windows,python исполняемый (я полагаю).

В отличии от работы вашей ОС Windows python от обычной командной строки (cmd.exe) или PowerShell консоли (powershell.exe) будет не экспоната этой проблема.