Python subprocess.Popen在命令执行后挂起

时间:2017-11-05 11:09:34

标签: python linux shell subprocess

我已经找到了类似的问题,但没有一个能够解决这个问题。如果我错过了什么,请道歉。

我正在尝试重定向子进程的输出。我只是想丢弃它。当我使用子进程的call函数时,该命令有效:

>>> import subprocess as sp
>>> cmd_l = ['service', 'iptables', 'restart']
>>> sp.call(cmd_l)
Redirecting to /bin/systemctl restart  iptables.service
0

但是当我使用Popen stdout和stderr params时,

>>> sp.Popen(cmd_l, stdout=None, stderr=None)
<subprocess.Popen object at 0x7fbc74a6ed90>
>>> Redirecting to /bin/systemctl restart  iptables.service

shell在命令后挂起,直到超时。此外,它仍然将命令输出打印到终端。我认为它可能与 stdout stderr 参数有关,所以我尝试了没有它们的命令,但结果是相同的。< / p>

脚本在机器上本地运行。

为什么会这样? 如何丢弃命令的输出并保留执行的返回码? (不使用 shell = True 选项

更新:我发现这个answer对我的情况有用,这就是我尝试做的事情:

with open(os.devnull, 'w') as devnull:
    sp.check_call(cmd, stdout=devnull, stderr=devnull)

此实现也可以:sp.call(cmd, stdout=sp.PIPE, stderr=sp.PIPE)并忽略PIPEs数据。

但是我的问题是 为什么Popen执行会在SSH会话超时之前挂起 ?还没有回答。

根据文档sp.call在proc上使用Popen然后使用wait。那么为什么只使用Popen似乎行为不同?

编辑:我正在打开与我的linux机器的SSH连接,在那台机器上我执行了交互式python命令。在我执行Popen之后,它似乎挂起(我没有输出,就像我正在等待命令响应)直到我得到Putty错误,表明连接已关闭。之后我可以重新连接。

0 个答案:

没有答案