当我在我的Python 3解释器(Python 3.4.2,通过brew安装)中尝试一些东西时,我遇到了一些我没想到的奇怪输出:
>>> import sys
>>> sys.stdout.write("foo")
foo3
>>> sys.stderr.write("bar")
3
bar
在尝试使用不同的字符串后,我认为数字是我传递的输入的长度。
我在Python 2.7.8(在输出中没有给出数字)和由virtualenv
创建的Python 3.4.2中尝试过这个(给出相同的结果)
输出应该是这样的吗?
答案 0 :(得分:5)
你是对的,这是长度。在Python 2中,File.write()
方法返回None
。当移动到Python 3时,返回值变为写入的字符数。
您从stdout
和stderr
获取不同输出的原因可能与文件句柄上显示的内容的顺序有关。
对于stdout
,write
输出"foo"
,然后REPL循环(在PIN码和ATM机的传统中)将计数输出到同一个流。
对于stderr
,REPL循环可能首先输出标准输出(长度),然后输出标准错误的内容。
或者,它可能是完全不确定的,它可能不是你应该依赖的东西,特别是因为除了解释器的交互模式之外,REPL循环并不存在。
答案 1 :(得分:4)
在python解释器中,当你打印一些东西时,它会在stdout和stderr上显示结果。
我在我的python 3.4中测试过它。这就是我认为正在发生的事情
sys.std.write("foo") = > foo3
Interpreter将“foo”写入stdout。然后解释器打印sys.stdout.write方法的结果,该方法为3.最终结果为foo3。尝试sys.stdout.write(“foo \ n \ n”)。这可能有助于你看到。
sys.stderr.write("bar") =>
3
bar
错误的流没有stdout那么快。写入的3个结果首先显示一个新的行字符。酒吧打印完毕后。
答案 2 :(得分:2)
这种现象是正常的。发生这种情况是因为sys.stdout.write()
返回了文本的长度。在python文件中重试此代码。你看,这不再发生了。之所以会发生这种“奇怪的事情”,是因为python会自动打印返回值,除非您使用python文件执行代码。
>>>'text'
'text'
如果在python文件中执行此操作,将不会有任何结果。 您可以通过停止以下返回来防止这种情况:
>>>_=sys.stdout.write('text')
或执行以下操作:
>>>def noreturn(value):
... pass
>>>noreturn(sys.stdout.write('text'))