2012-03-08 6 views
4

У меня есть просто скрипт, который напечатать какое-то сообщение на консоль,странного поведения Ио перенаправления

#!/usr/bin/python 
import sys 
print >>sys.stdout, "1 stdout" 
print >>sys.stderr, "2 stderr" 

нормальной последовательность,

[[email protected]:codes]$ ./x.py 
1 stdout 
2 stderr 

[[email protected]:codes]$ ./x.py 2>&1 
1 stdout 
2 stderr 

неправильный порядок выпуска,

[[email protected]:codes]$ ./x.py &>x.txt 
[[email protected]:codes]$ cat x.txt 
2 stderr 
1 stdout 
[[email protected]:codes]$ ./x.py 2>&1 | tee x.log 
2 stderr 
1 stdout 

Похоже, что добавление sys.stdout.flush() может решить проблему, есть ли способ заставить последовательность сообщений (красным перенаправить вывод/ошибку в файл) без изменения сценария?

ответ

4

Вы можете запустить python с флагом -u, чтобы заставить stdin, stdout и stderr не загружаться. Для этого есть штраф за исполнение. Лучше делать явные операции .flush() в любой момент, когда вы намерены, чтобы все было «видимым сразу», как потому, что оно более эффективно, так и потому, что делает ваше намерение очевидным («это должно быть сразу видно!»).

+0

классный, я никогда не знаю, что есть такой вариант. благодаря! –

Смежные вопросы