Python中的异步标准输入读取

3

一个程序连续每次输出一行到标准输出。

我正在尝试读取和处理这个输入的每一行,而不必等待程序完成。

例如,下面的writeOutput.py会一次写入一行到stdout(在每行之间等待1到3秒)。

调用./writeOutput.py | ./processEachLine.py需要writeOutput.py完成后,processEachLine.py才能开始处理第一行。

有没有办法在python中实现这一点?即使是直接在python程序中调用writeOutput.py,而不是使用管道?

任何帮助都将不胜感激。

writeOutput.py:

#!/usr/bin/env python
import random
import time

i = 0
while i < 5:  
    n = int(1 + (random.random()*10) % 3)
    i += 1
    time.sleep(n)
    print(str(n) + " test")  

processEachLine.py

#!/usr/bin/env python    
import sys

while 1:
    line = sys.stdin.readline()
    if not line:
      break
    print(">>" + line)
1个回答

5

与其

#!/usr/bin/env python

使用

#!/usr/bin/env python -u

谢谢。#!/usr/bin/env python -u 会创建一个错误:"/usr/bin/env: python -u: No such file or directory" 一个简单的解决方法是使用 python -u writeOutput.py | python -u processEachLine.py 或者添加 #!/usr/bin/python -u非常感谢您的帮助。 - tartifletteblvd
很奇怪,我这边运行良好(在OS X和Linux上测试过)。你用的是什么操作系统? - uselpa
1
这可能有点过时了,但破折号可能不好 - 通过复制tartifletteblvd的评论中的破折号成功地重新创建了错误。 - Nitz
实际上,hashbang机制将第一行的剩余部分解析为一个程序名(/usr/bin/env)和一个参数(python -u,包括空格,但并不是一个程序,你可以理解为选项)。因此,#!/usr/bin/python -u有效,而#!/usr/bin/env python -u无效。参见:https://dev59.com/M2855IYBdhLWcg3wg0nC#4304187 - tzot
@tzot,虽然已经过了很长时间,但我记得在发布答案之前我曾尝试过它(我总是这样做),而且它确实有效。我还假设它对OP也起作用了,因为他接受了这个答案。你自己真的尝试过这个方法吗?如果是,你使用的是什么平台(我使用的是OS X)? - uselpa
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接