python的打印奇怪的行为

时间:2013-10-02 07:01:56

标签: python select stdin file-descriptor

import select
import sys
inputs=[sys.stdin]
while 1:
    readable,w,e=select.select(inputs,[],inputs)
    for r in readable:
        print 1,
        raw_input()
        print 2
        print 3,

当我在Ubuntu上尝试这个python代码时,假设我在终止中随机输入'asd'。它显示:

asd
1 2
asd
3 1 2

似乎“print blabla”的行为会受到stdin文件描述符状态的影响,但“print blabla”却没有。有人能告诉我那里发生了什么吗?

2 个答案:

答案 0 :(得分:0)

打印xxxxxx与打印xxxxxx之间存在差异,

print "Yes"

将在屏幕上打印“是”并添加\ n(换行符)

print "Yes",

将在没有\ n(换行符)

的情况下在屏幕上打印“是”

答案 1 :(得分:0)

正如评论中所指出的,您在Python 2.x中看到行缓冲标准输出的效果:,中的尾随print将阻止它发出新行。在发出新行之前,不会打印带有,结尾的文本。您可以使用一些简单的代码删除缓冲:

#!/usr/bin/env python
import sys
class Logger(object):
    def __init__(self, stream):
        self.stream = stream

    def write(self, msg):
        self.stream.write(msg)

    def flush(self):
        pass

if __name__ == '__main__':
    sys.stdout = Logger(sys.stdout)
    print 'User says hello!',
    print 'Goodbye, cruel world!'

如您所见,sys.stdout被替换为在每次打印后执行flush的其他流。您还可以查看this threadthis one以获取更多信息。