从wget捕获Python输出?

从wget捕获Python输出?,python,Python,可以从wget和其他使用诅咒的命令行程序捕获输出吗? 以下是我现在拥有的: p = subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=0) for line in p.stdout: print "a" 这适用于输出简单的程序,但不适用于wget和其他使用诅咒的程序。我不相信wget正在使用诅咒 通常,当我想在脚本中使用wget时,我会使用-O-选项强制将其输出到stdout。我怀疑您试图捕获运行控制台时在控制台上正常看到的文本

可以从wget和其他使用诅咒的命令行程序捕获输出吗? 以下是我现在拥有的:

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

这适用于输出简单的程序,但不适用于wget和其他使用诅咒的程序。

我不相信
wget
正在使用诅咒

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

在Python之外的命令行中,只需运行如下命令:

wget -O - http://www.somesite.org/ > /tmp/wget.out 2> /tmp/wget.err
然后看两个输出文件。如果您在控制台/终端上看到来自
wget
的任何输出,那么您运行的命令与我看到的不同

如果,正如我所怀疑的,您实际上对stderr消息感兴趣,那么您有两个选择

  • 更改命令以添加2>&1,并将
    shell=True
    添加到
    Popen()
    参数中
  • 或者(最好)将
    stderr=subprocess.PIPE
    添加到
    Popen()
    参数中
如果您没有使用stdout(假设您使用
wget
获取数据并将其写入文件)。在后一种情况下,从stderr文件选项读取数据

顺便说一句:如果你真的需要捕获诅咒数据。。。您可以尝试使用标准的pty模块,但我不建议这样做。您最好从以下位置获取
pexpect
模块:

  • :

不要被年龄或版本编号吓跑,它适用于Python 2.5和2.6以及2.4和2.3。

我不认为wget使用诅咒。它只是将其消息打印到stderr,而不是stdout。对于wget的情况,您可能需要拦截stderr(参见一些示例)来拦截curses程序-我怀疑当您需要模拟终端时,这会很快变得乏味…我的错,我认为要更新现有的行,你必须使用诅咒。在终端应用程序中打印进度条和微调器的一种常见方法是使用backspace/rubout字符。最好检查您的文件描述符是否连接到终端(避免将常规文件与ASCII控制字符混在一起)。然而,这并不需要诅咒。事实上,pythontermios模块正是实现这类功能所需要的。(通常,即使没有termios模块,您也可以使用sys.stdout.write(chr(0x08))在当前行上的字符上退格)。使用pexpect是绝对正确的,正如我在最近的其他答案中所建议的那样——例如,请看我为什么要添加shell=True?它一点也不方便——而且不需要调用一个新的shell进程。我指出,对于2>&1排序的重定向,您要么必须执行shell=True,要么必须执行自己的os.fork()、os.dup2()和os.execve()函数。您应该在“完成”之前(即进程完成之前)获得wget的输出。然而,你可能看到了一些缓冲效应。尝试在子进程列表中设置bufsize=0。@吉姆·丹尼斯:你错了。Popen可以做
2>&1
很好,您不需要fork任何东西,它可以在所有平台上工作。只需使用subprocess.Popen(cmd,stderr=subprocess.STDOUT)