2012-03-09 34 views
1

我越來越想捕捉Django的manager.py既不是STDOUT也不是STDERR的程序輸出?

> ./manage.py runserver 0.0.0.0:2869 
Validating models... 

0 errors found 
Django version 1.3.1, using settings 'polling.settings' 
Development server is running at http://0.0.0.0:2869/ 
Quit the server with CONTROL-C. 
Error: That port is already in use. 

> ./manage.py runserver 0.0.0.0:2869 >stdout 2>stderr 

> cat stderr 
Error: That port is already in use. 

> cat stdout 

> 

爲什麼我會得到一個空字符串,當我試圖捕捉第二輪輸出的輸出時,一些非常奇怪的行爲?

回答

2

任何程序都可以檢測其STDOUT和/或STDERR是否連接到終端:man isatty(3)。 Python也有這樣的功能:sys.stdout.isatty()。

可能是您的python腳本或其日誌子系統僅在終端運行時(即在交互模式下)打印第二次運行時丟失的行。這是一個普遍而恰當的做法。例如,如果將輸出重定向到日誌文件,則沒有意義打印"Quit the server with CONTROL-C"

下面是一個簡單的例子:

#!/usr/bin/python 

import sys 

print "Print always." 
if sys.stdout.isatty(): 
    print "Print only on tty!" 

這裏,我們去:

$ ./test.py 
Print always. 
Print only on tty! 
$ ./test.py > log 
$ cat log 
Print always. 
$ 
+0

我怎麼能檢測如果是這樣的話?有沒有一種方法可以調用該程序並將isatty()設置爲true? (我認爲它是像Bash這樣設置的) 在輸出中至少有一種「窺探」方法嗎? – Sandro 2012-03-09 20:06:32

+0

我很確定,情況就是這樣。您可以通過閱讀腳本來檢查它:例如,查找字符串'「服務器正在運行,並查看它是如何打印的。是否有一些針對'sys.stdout.isatty()'的測試,或者它是否使用某種log()而不是print()。如果是這樣,那麼查找'log()'代碼等等。 您不能將isatty()設置爲任何值 - 系統會執行此操作。並且沒有什麼可以或者應該「窺探」 - 腳本只是在輸出重定向到文件時不打印該行。它可以檢測輸出是否被重定向。 – 2012-03-10 05:01:46

+0

@Sandro我已經更新了答案,以說明以上所有...... – 2012-03-10 05:18:49

相關問題