2012-03-09 57 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

相关问题