如何连续读取标准输入(不仅仅是输入文件完成后)?

How to continuously read from stdin (not just once input file is done)?

我有这两个脚本:

clock.py

#!/usr/bin/env python3
import time

while True: 
    print("True", flush=True)
    time.sleep(1)

continuous_wc.py

#!/usr/bin/env python3
import sys

def main():
    count = 0
    for line in sys.stdin:
        sys.stdout.write(str(count))
        count += 1

if __name__=='__main__':
    main()

我运行他们是这样的:

./clock.py | ./continuous_wc.py

我希望它打印:

1
2
3
4
5
...

每一秒都像一个时钟,因为它基本上是在计算文件中的行数。但它不输出任何东西。为什么不呢?

除了print(x, flush=True)你还必须在sys.stdout.write之后冲洗。

请注意,这些程序在技术上可以在没有刷新的情况下运行,但它们很少会以非常大的块打印值,因为 Python IO 缓冲区有很多千字节。冲洗是为了让它更实时地工作。

sys.stdout.write(str(count))
sys.stdout.flush()

听取大家的建议,这就是我现在所拥有的(有效):

clock.py

#!/usr/bin/env python3
import time

while True:
    print("True", flush=True) 
    time.sleep(1)

continuous_wc.py

#!/usr/bin/env python3
import sys

def main():
    count = 0
    for line in sys.stdin:
        print(count, flush=True, end='\r')
        count += 1

if __name__=='__main__':
    main()

我不得不在写入和读取脚本中使用 flush=True。但是,当使用 PYTHONUNBUFFERED=1 时,我可以跳过它并且它起作用了。谢谢@Mark Setchell。此外,我正在使用 printstdin,但似乎 fileinput.input 也可以。