在尝试捕获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
>
为什么我在第二次运行时尝试捕获输出时会得到空字符串?
答案 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.
$