Python3解释器将每次写入的长度打印到标准输入

Python3解释器将每次写入的长度打印到标准输入,python,anaconda,Python,Anaconda,关于这种行为,有几个问题: >>> import sys >>> sys.stdout.write("aaaa") aaaa4 >>> 我知道那里发生了什么。我不明白的是在我的例子中发生了什么:无论我打开哪个文件,每当我使用其.write方法时,数据的长度都会写入控制台/tostdout >>> with open("garbage.file", "wb") as f: ... for x in range(4):

关于这种行为,有几个问题:

>>> import sys
>>> sys.stdout.write("aaaa")
aaaa4
>>>
我知道那里发生了什么。我不明白的是在我的例子中发生了什么:无论我打开哪个文件,每当我使用其
.write
方法时,数据的长度都会写入控制台/to
stdout

>>> with open("garbage.file", "wb") as f:
...     for x in range(4):
...         f.write(b"xyz")
...
3
3
3
3
>>> with open("garbage.file", "rb") as f:
...     assert f.read() == b"xyzxyzxyzxyz"
...
>>>
但是,当我让
python
将其作为脚本运行时,不会出现这种行为:

D:\>type CON > test.py
with open("garbage.file", "wb") as f:
    f.write(b"xyz")

^Z

D:\>python test.py

D:\>type garbage.file
xyz
D:\>
在Windows命令提示符下使用的任何新Python 3.5解释器(无论是“普通”命令提示符还是“Anaconda命令提示符”)都会出现这种情况


我以前从未见过这种行为,而且它看起来也不应该发生。原因可能是什么?如何解决这个问题?

这似乎是这个问题的重复:

这说明
.write()
返回写入文件后写入的字符数。这解释了为什么您在解释器中看到它,而不是您创建的文件

编辑:显示解释器的示例显示返回值,python可执行文件忽略它们

>>> def show(string):
...     print(string)
...     return(len(string))
... 
>>> show('foobar')
foobar
6
现在,如果我创建了一个与我得到的内容完全相同的文件:

$ python show.py 
foobar

这是因为python可执行文件不显示返回值,而解释器显示返回值。

这似乎是这个问题的重复:

这说明
.write()
返回写入文件后写入的字符数。这解释了为什么您在解释器中看到它,而不是您创建的文件

编辑:显示解释器的示例显示返回值,python可执行文件忽略它们

>>> def show(string):
...     print(string)
...     return(len(string))
... 
>>> show('foobar')
foobar
6
现在,如果我创建了一个与我得到的内容完全相同的文件:

$ python show.py 
foobar

这是因为
python
可执行文件不显示返回值,而解释器显示返回值。

。我不是在Python提示符下编写表达式,而是一条语句。此外,这并不能解释它如何在每次执行时打印表达式语句的值。当然,这是不正常的行为。对不起,也许我很快就把它称为复制品。但我认为链接线程解释了你的问题所在。在解释器中运行代码将始终显示您运行的任何函数的返回值,而通过
python
executable运行它将不会显示返回值。我不认为这是不正常的行为。我已经编辑了我的原始答案,添加了一些澄清,这还有帮助吗@Rhymoid@Rhymoid交互式解释器打印未赋值表达式的值,除非其计算结果为
None
@PM2Ring。。。你说得对,我想知道我以前怎么从来没有吃过这个。我看不出这是一个复制品。我不是在Python提示符下编写表达式,而是一条语句。此外,这并不能解释它如何在每次执行时打印表达式语句的值。当然,这是不正常的行为。对不起,也许我很快就把它称为复制品。但我认为链接线程解释了你的问题所在。在解释器中运行代码将始终显示您运行的任何函数的返回值,而通过
python
executable运行它将不会显示返回值。我不认为这是不正常的行为。我已经编辑了我的原始答案,添加了一些澄清,这还有帮助吗@Rhymoid@Rhymoid交互式解释器打印未赋值表达式的值,除非其计算结果为
None
@PM2Ring。。。你说得对,我想知道我以前怎么从来没有吃过这个。我不认为这是重复的。这是一个更一般的问题。我之所以被带到这里,是因为我的交互式Python正在打印8,我认为这是字符串长度。如果有什么区别的话,这是一个更一般的问题。如果我用“8”搜索,我就不会找到这个有用的问题和答案。然而,这篇文章中的OP提到了长度。另外,@Kieran,你在这里的答案更好,因为它不仅通过注意交互式控制台(解释器)和Python脚本之间的差异更好地(更完整地)解释了这个问题。另外,@Kieran,这篇文章中还有一个问题(“我如何解决它?”),我想回答。我不能这样做,因为这篇文章由于被贴上了重复的标签而关闭了。在这里添加链接的同时,我将为另一篇文章添加答案。顺便说一下,修复方法是将返回值分配给解释器上的变量,例如使用
catch\u ret\u val=f.write(b'xyz')
我认为这不是重复的。这是一个更一般的问题。我之所以被带到这里,是因为我的交互式Python正在打印8,我认为这是字符串长度。如果有什么区别的话,这是一个更一般的问题。如果我用“8”搜索,我就不会找到这个有用的问题和答案。然而,这篇文章中的OP提到了长度。另外,@Kieran,你在这里的答案更好,因为它不仅通过注意交互式控制台(解释器)和Python脚本之间的差异更好地(更完整地)解释了这个问题。另外,@Kieran,这篇文章中还有一个问题(“我如何解决它?”),我想回答。我不能这样做,因为这篇文章由于被贴上了重复的标签而关闭了。在这里添加链接的同时,我将为另一篇文章添加答案。顺便说一下,修复方法是将返回值分配给解释器上的变量,例如使用
catch\u ret\u val=f.write(b'xyz')