艰苦学习Python(第三版)练习11输入输入后才打印打印语句

时间:2017-01-20 23:46:23

标签: python printing cygwin raw-input

艰难学习Python(第三版)声明如果使用MS Windows,则使用Powershell。

为了模仿Linux环境,我下载了cygwin,因为Zed Shaw声称Linux是可以接受的。

前10个练习顺利完成。

不幸的是,我在练习11"提出问题"。

时遇到了问题

$ more 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文件导致打印语句仅在提供三行输入后打印?

$ 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.

好奇。

任何人都可以提供解释和解决方案吗?

谢谢!

-Python Newbie

2 个答案:

答案 0 :(得分:0)

我发现这个堆栈溢出帖子描述了类似的症状...... raw_input() won't show prompt until after input

其中的原因被认为是缓冲问题。

其中推荐的解决方案声明使用-u选项运行python。

检查python帮助页面:

$ python -h

...

-u:无缓冲的二进制stdout和stderr; PYTHONUNBUFFERED = x          有关与' -u'

相关的内部缓冲的详细信息,请参见手册页

...

事实证明,似乎也解决了我的问题 - 至少在短期内。

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

$ python -u ex11.py

你多大了? 32

你有多高? 6' 2"

你体重多少? 180

所以,你是' 32'老了,' 6 \' 2"'高大的' 180'重。

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

不幸的是,如果我想运行那个.py文件,我必须使用-u选项。它不像缓冲区被永久清除。 :(

几秒钟后的另一次尝试导致了同样的初始问题。

$ python ex11.py

32

6' 2"

180

你多大了?你有多高?你有多重?所以,你是' 32'老了,' 6 \' 2"'高大的' 180'重。

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

是否有长期固定?

答案 1 :(得分:0)

在每个Cygwin(bash)会话开始时,运行:

export PYTHONUNBUFFERED=1

,对于持久解决方案,请将该行添加到~/.bashrc文件中; e.g:

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

这样您就不必每次都将-u传递给python可执行文件,因此可以直接调用*.py个文件。

使用值PYTHONUNBUFFERED和命令行选项1定义环境变量-u都具有以下效果,正如您所发现的那样,它可以解决您的问题(来自v2.7 docs):

  

强制stdin,stdout和stderr完全无缓冲。在重要的系统上,还将stdin,stdout和stderr置于二进制模式。

     

请注意,file.readlines()和文件对象(对于sys.stdin中的行)有内部缓冲,不受此选项的影响。要解决这个问题,你需要在while 1:loop中使用file.readline()。

注意:这是必要的,因为您的异常设置:将Cygwin与 Windows python可执行文件(我推测)相结合。

相比之下,从常规命令提示符(python)或PowerShell控制台(cmd.exe)运行Windows powershell.exe会使出现此问题。< / p>