2009-08-17 124 views
1

是否可以捕获wget和其他使用curses的命令行程序的输出? 这是我现在所拥有的:从wget捕获python输出?

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

这对于具有简单的输出程序工作正常,但不是wget和使用诅咒其他程序。

+2

我不认为wget使用curses。它只是将其消息打印到stderr而不是stdout。 – 2009-08-17 22:57:26

+0

对于wget的情况,您可能需要拦截(请参阅http://blog.doughellmann.com/2007/07/pymotw-subprocess.html中的某些示例)。为了拦截curses程序 - 我怀疑会当你需要模拟终端时,很快变得很乏味... – 2009-08-17 22:59:08

+0

我的不好,我认为要更新现有的行,你必须使用curses。 – 2009-08-17 23:18:10

回答

6

我不认为wget正在使用curses。

通常当我想用wget在脚本中我会使用-O -选项,其输出强制标准输出。我怀疑你试图捕获文本,你通常看到您的控制台上,当你运行它,这将是 stderr

在命令行中,巨蟒外,只需运行一个命令,如:

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

然后看两个输出文件。如果你在控制台/终端上看到wget的任何输出,那么你正在运行一些不同于我所见的命令。

如果我怀疑你确实对 stderr消息感兴趣,那么你有两种选择。

  • 更改您的命令添加2> & 1,并添加shell=TruePopen()参数
  • 或者(最好)添加stderr=subprocess.PIPEPopen()参数

前者是方便,如果你间没有” t使用 stdout无论如何(假设您使用 wget来获取数据并将其写入文件)。在后一种情况下,您从 stderr文件选项读取以获取您的数据。

顺便说一句:如果你真的需要捕捉诅咒数据...你可以尝试使用标准 PTY模块,但我不会建议。你会好得多获取的pexpect模块来自:

,不要被年龄或版本编号被吓跑了,它的工作原理上的Python 2.5和2.6以及2.4和2.3。

+0

如何在wget完成之前打印它? – 2009-08-18 00:12:19

+1

当然,如我在其他最近的答案中推荐的那样,例如,请参阅http://stackoverflow.com/questions/1283061 – 2009-08-18 01:44:00

+1

为什么要添加shell = True?它根本不方便 - 并且不必要地调用一个新的shell进程。 – nosklo 2009-08-18 03:27:18