2009-08-17 161 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