【问题标题】:Why does writing to stdout in console append the number of characters written, in Python 3?为什么在控制台中写入标准输出会附加在 Python 3 中写入的字符数?
【发布时间】:2016-08-31 01:13:05
【问题描述】:

我只是在 Python 控制台中使用 sys.stdout.write() 时发现这会产生一些奇怪的输出。

对于每个write() 调用写入的字符数,分别传递给函数并附加到控制台的输出。

>>> sys.stdout.write('foo bar') 例如导致 foo bar7 正在打印出来。

即使传递一个空字符串也会导致输出0

这实际上只发生在 Python 控制台中,但不会在执行具有相同语句的文件时发生。更有趣的是,它只发生在 Python 3 上,而不发生在 Python 2 上。

虽然这对我来说并不是一个真正的问题,因为它只发生在控制台中,但我真的很想知道它为什么会这样。

我的 Python 版本是 Ubuntu 15.10 下的 3.5.1。

【问题讨论】:

    标签: python python-3.x stdout sys


    【解决方案1】:

    除了写出给定的字符串,write还会返回字符数(其实是字节,试试sys.stdout.write('へllö'))因为python控制台将每个表达式的返回值打印到stdout,返回值被追加以实际打印值为准。

    因为write 没有附加任何换行符,所以看起来是同一个字符串。

    您可以使用包含以下内容的脚本来验证这一点:

    #!/usr/bin/python
    import sys
    
    ret = sys.stdout.write("Greetings, human!\n")
    print("return value: <{}>".format(ret))
    

    这个脚本应该在执行时输出:

    Greetings, human!
    return value: <18>
    

    文档here 中提到了此行为。

    【讨论】:

    • 有趣。所以a = sys.stdout.write('foo') 应该揭示这种行为它实际上也做了什么。在这种情况下,a 设置为 3,并且 number 不再附加到输出中。但我仍然想知道为什么这只发生在 Python 3 中。Afaik 我在文档中也找不到任何提及。
    • 我附加了一个显示结果的脚本,以使事情更清楚。我并没有真正阅读文档,我只是假设它是因为它发生在很多语言中并对其进行了测试。我会搜索提及这一点的 PEP,如果我这样做了,我会回到这里。
    • 只是添加,它计算Unicode字符sys.stdout.write('へllö')返回“へllö4”
    • @critop 是因为 IO 从 2 改成了 3。stdout 的类型是file,它声明了write 没有返回值。新类型是TextIOWrapper,其中一个基类 (TextIOBase) 声明 write 以返回写入的字符数。
    猜你喜欢
    • 1970-01-01
    • 2010-10-28
    • 2012-01-01
    • 1970-01-01
    • 2015-11-19
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多