subprocess.stdout.readline()在将stderr重定向到subprocess.STDOUT]时挂起。

问题描述 投票:0回答:1
我一直在寻找其他类似的问题,但我认为没有人涵盖这个特殊情况。

我发现在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()成为...

python subprocess
1个回答
0
投票
[对于发现此问题的任何人,我都巧妙地使用了signal来解决此问题。
© www.soinside.com 2019 - 2024. All rights reserved.