0

我正在使用 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

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

我曾尝试研究subprocess docs,但我认为我太缺乏经验,无法为自己弄清楚。

4

2 回答 2

1

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

您可以使用-nv(non verbose) 或-q(quiet) 作为 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。

于 2013-06-28T08:06:57.443 回答
1

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

于 2013-06-28T08:00:38.010 回答