是否可以捕获wget和其他使用curses的命令行程序的输出? 这是我现在所拥有的:从wget捕获python输出?
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=0)
for line in p.stdout:
print "a"
这对于具有简单的输出程序工作正常,但不是wget和使用诅咒其他程序。
是否可以捕获wget和其他使用curses的命令行程序的输出? 这是我现在所拥有的:从wget捕获python输出?
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=0)
for line in p.stdout:
print "a"
这对于具有简单的输出程序工作正常,但不是wget和使用诅咒其他程序。
我不认为wget
正在使用curses。
通常当我想用wget
在脚本中我会使用-O -
选项,其输出强制标准输出。我怀疑你试图捕获文本,你通常看到您的控制台上,当你运行它,这将是 stderr。
在命令行中,巨蟒外,只需运行一个命令,如:
wget -O - http://www.somesite.org/ > /tmp/wget.out 2> /tmp/wget.err
然后看两个输出文件。如果你在控制台/终端上看到wget
的任何输出,那么你正在运行一些不同于我所见的命令。
如果我怀疑你确实对 stderr消息感兴趣,那么你有两种选择。
shell=True
您Popen()
参数stderr=subprocess.PIPE
您Popen()
参数前者是方便,如果你间没有” t使用 stdout无论如何(假设您使用 wget
来获取数据并将其写入文件)。在后一种情况下,您从 stderr文件选项读取以获取您的数据。
顺便说一句:如果你真的需要捕捉诅咒数据...你可以尝试使用标准 PTY模块,但我不会建议。你会好得多获取的pexpect
模块来自:
,不要被年龄或版本编号被吓跑了,它的工作原理上的Python 2.5和2.6以及2.4和2.3。
如何在wget完成之前打印它? – 2009-08-18 00:12:19
当然,如我在其他最近的答案中推荐的那样,例如,请参阅http://stackoverflow.com/questions/1283061 – 2009-08-18 01:44:00
为什么要添加shell = True?它根本不方便 - 并且不必要地调用一个新的shell进程。 – nosklo 2009-08-18 03:27:18
我不认为wget使用curses。它只是将其消息打印到stderr而不是stdout。 – 2009-08-17 22:57:26
对于wget的情况,您可能需要拦截(请参阅http://blog.doughellmann.com/2007/07/pymotw-subprocess.html中的某些示例)。为了拦截curses程序 - 我怀疑会当你需要模拟终端时,很快变得很乏味... – 2009-08-17 22:59:08
我的不好,我认为要更新现有的行,你必须使用curses。 – 2009-08-17 23:18:10