我已经找到了类似的问题,但没有一个能够解决这个问题。如果我错过了什么,请道歉。
我正在尝试重定向子进程的输出。我只是想丢弃它。当我使用子进程的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错误,表明连接已关闭。之后我可以重新连接。