Python:只从subprocess.call()打印stderr,而不打印stdout



我正在使用Python的subprocess.call(此处为文档),我对标准输出有一个问题。

我有以下命令:

subprocess.call("wget http://google.com", shell=True)

它工作得很好,但它打印wget的输出,所以我得到了大量的wget输出,比如:

--2013-06-28 08:54:47--  http://google.com/
Resolving google.com... 173.194.41.100, 173.194.41.98, 173.194.41.97, ...
Connecting to google.com|173.194.41.100|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
.... etc

如何更改呼叫,使其仅在出现错误时打印任何内容?

我试过研究子流程文档,但我觉得我太缺乏经验了,无法自己弄清楚。

实际上,我认为最简单的方法是使用"wget"的"-q"选项。您仍然可以通过查看返回值来发现错误。

wget通常会在stderr上报告所有输出,因此重定向stdout仅对获取错误没有帮助。

您可以使用-nv(非详细)或-q(安静)作为wget的选项,不同之处在于-q甚至不报告错误,而-nv向stderr报告错误或单个成功行。

返回代码在这两种情况下都是不变的,所以如果您喜欢的话,可以使用它来检测任何错误。

编辑:如果你真的只是想忽略wget的所有输出,你可以将stderrstdout重定向到一个空设备;

import subprocess
import os
DEVNULL = open(os.devnull, 'wb')
subprocess.call("wget http://google.com/", stdout=DEVNULL, stderr=DEVNULL, shell=True)

在我的Python 3.3.1安装中,DEVNULL可以从子流程导入,但我找不到关于它添加到哪个版本的文档。以上内容在Python2和Python3中都适用。

最新更新