Python 3.x 尝试读取proc.stdout.readline中的所有行时陷入无限循环
我正在尝试读取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
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
。