Python 如何捕获 wget 输出?

2 投票
1 回答
5979 浏览
提问于 2025-04-15 13:40

有没有办法捕捉到wget和其他使用curses的命令行程序的输出呢?

我现在有的代码是这样的:

p = subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=0)
for line in p.stdout:
    print "a"

这个方法对于那些输出比较简单的程序是有效的,但对于wget和其他使用curses的程序就不行了。

1 个回答

7

我不认为 wget 是在使用 curses。

通常,当我想在脚本中使用 wget 时,我会用 -O - 这个选项来强制它把输出发送到 stdout(标准输出)。我怀疑你是想捕捉到你在运行它时,通常在控制台上看到的文本,这些文本其实是 stderr(标准错误输出)。

在命令行中,脱离 Python,你可以运行类似下面的命令:

wget -O - http://www.somesite.org/ > /tmp/wget.out 2> /tmp/wget.err

然后查看这两个输出文件。如果你在控制台/终端上看到任何来自 wget 的输出,那你运行的命令可能和我见过的有所不同。

如果,正如我猜测的,你实际上是对 stderr 消息感兴趣,那么你有两个选择。

  • 把你的命令改成加上 2>&1,并在你的 Popen() 参数中加上 shell=True
  • 或者(更推荐)在你的 Popen() 参数中加上 stderr=subprocess.PIPE

前者在你本来就不使用 stdout 的情况下很方便(假设你是用 wget 来获取数据并写入文件)。在后者的情况下,你可以从 stderr 文件选项中读取数据。

顺便说一下:如果你真的需要捕捉 curses 数据……你可以尝试使用标准的 pty 模块,但我不推荐这样做。你更应该去获取 pexpect 模块,地址是:

而且不要被它的版本号或年代吓到,它在 Python 2.5 和 2.6 以及 2.4 和 2.3 上都能正常工作。

撰写回答