艰难学习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
答案 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>