Python 如何捕获 wget 输出?
有没有办法捕捉到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 上都能正常工作。