Python 3.x 尝试读取proc.stdout.readline中的所有行时陷入无限循环

Python 3.x 尝试读取proc.stdout.readline中的所有行时陷入无限循环,python-3.x,subprocess,stdout,Python 3.x,Subprocess,Stdout,我正在尝试读取proc.stdout.readline中的每一行,并通过网络发送这些行,例如: data = b'' for line in iter(proc.stdout.readline, ''): data += line clientsocket.send(data) 当我运行此代码时,我似乎陷入了一个有限的循环中,无法跳转到行: clientsocket.send(data) 有没有更有效的方法读取数据?我也尝试过使用while循环并打破“if not line”: da

我正在尝试读取proc.stdout.readline中的每一行,并通过网络发送这些行,例如:

data = b''
for line in iter(proc.stdout.readline, ''):
    data += line
clientsocket.send(data)
当我运行此代码时,我似乎陷入了一个有限的循环中,无法跳转到行:

clientsocket.send(data)
有没有更有效的方法读取数据?我也尝试过使用while循环并打破“if not line”:

data = b''
while True:
    line += proc.stdout.readline()
    data += line
    if not line:
        break
clientsocket.send(data)
这似乎也产生了同样的结果。是否有更有效的方法从proc.stdout.readline读取所有数据?

语句:
iter(proc.stdout.readline,“”)
将执行阻塞读取,直到收到EOF

如果您想阅读所有行,则只需执行以下操作:

data = b''
data = b"".join(proc.stdout.readlines())
除了让
proc
更快地生成行之外,没有其他解决方案。 如果需要,您可以读取带有超时的行(即,您可以等待读取选定数量的字符,或者如果未读取该数量的字符,则为超时)

这些答案可以在这里找到:


    • 我也遇到了同样的问题。奇怪的是,在Python2.7中,收敛并实际停止迭代没有问题。 在调试过程中(在Python 3.5中),我注意到所有真正的行都返回
      '\n'
      字符,而不应该到达的行返回为空字符串,即
      '
      。因此,我刚刚添加了一个if子句,用于检查
      '
      ,如果为正,则中断循环。
      我的最终版本如下:

      行=[]
      对于iter中的_行(process.stdout.readline,b“”):
      如果_line=='':
      打破
      行。追加(_行)
      

      值得一提的是,我在
      subprocess.Popen(…)
      调用时使用了
      universal\u newlines=True
      参数。

      如果打印
      line
      ,你能看到什么吗?是的@RahulBharadwajOk,所以它不会陷入无限循环,问题是,
      proc.stdout.readline
      从未收到
      EOF
      ,因此它正在等待读取更多字符。您有解决方案吗?
      data
      建议
      stdout
      生成
      字节。
      '
      的哨兵是一个
      str
      ,由于类型不匹配,它永远不会等于
      stdout
      产生的任何东西。这似乎也不起作用,也许我应该求助于超时?你确定子进程返回一些输出吗?我肯定它返回outputI,我看到了,如果子流程花费大量时间返回完整输出,则可以使用超时返回部分输出。除此之外,我看不到其他解决方案。线索是在
      select.poll
      之后使用
      os.read
      ,而不是
      proc.stdout.readlines