程序输出既不是STDOUT也不是STDERR?

时间:2012-03-09 08:36:50

标签: python bash stdout stderr

在尝试捕获django的manager.py

的输出时,我遇到了一些非常奇怪的行为
> ./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

>

为什么我在第二次运行时尝试捕获输出时会得到空字符串?

1 个答案:

答案 0 :(得分: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.
$