Программный вывод, который не является ни STDOUT, ни STDERR? - PullRequest
1 голос
/ 09 марта 2012

Я получаю несколько странное поведение при попытке получить выходные данные менеджера django.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 Ответ

2 голосов
/ 09 марта 2012

Любая программа может обнаружить, подключен ли к ней терминал 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.
$
...