如何连续读取标准输入(不仅仅是输入文件完成后)?
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。此外,我正在使用 print
和 stdin
,但似乎 fileinput.input
也可以。
我有这两个脚本:
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。此外,我正在使用 print
和 stdin
,但似乎 fileinput.input
也可以。