我发现在Popen调用中使用
stderr = subprocess.STDOUT
会导致stdout.readline()在极少数情况下永远挂起;我最好的例子是尝试建立通道的内部SSH命令:ssh -N -f -L 81:<SOME URL>:80 <SOME OTHER URL>
[当我尝试在将stderr重定向到stdout的Popen中运行此命令时,它将打印2个输出,然后永远挂在stdout.readline()上:
import subprocess as sp
cmd = "ssh -N -f -L 81:<SOME URL>:80 <SOME OTHER URL>"
p = sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.STDOUT, shell=True, env=os.environ, encoding="utf-8")
while True:
out = p.stdout.readline()
if out:
print(out)
if p.poll() is not None:
break
我将stderr重定向到stdout,以便可以将两个流都放在一个位置。
在尝试使用readline()之前,有没有一种方法可以检查是否有一行要阅读?
而且,如果过程完成,为什么readline()为什么不简单地返回""
?这似乎是一个巨大的错过。
我一直在寻找其他类似的问题,但我认为没有人涵盖这个特殊情况。我发现在Popen调用中使用stderr = subprocess.STDOUT会导致stdout.readline()成为...
signal
来解决此问题。