koluna
А где про это сказано?
C89 (draft)
4.9.3 Files
…
At program startup, three text streams are predefined and need not
be opened explicitly — standard input (for reading conventional
input), standard output (for writing conventional output), and
standard error (for writing diagnostic output). When opened, the
standard error stream is not fully buffered; the standard input and
standard output streams are fully buffered if and only if the stream
can be determined not to refer to an interactive device.
Сейчас проверил, строковая буферизация там и для sys.stdout, и для sys.stderr.
Но если сделать вот так:
t.py
#!/usr/bin/env python
# coding: utf-8
import sys
import time
print 'a'
time.sleep(5)
В консоли:
то включается полная, потому что вывод не привязан к терминалу.
koluna
Почему, если для stdout включена полная буферизация
Строковая там, потому что обнаружен терминал.
Они могли, конечно, реализовать работу со стандартными потоками и в обход стандартной сишной библиотеки, прямо через системные вызовы. Тогда буферизация вообще может работать как угодно. Но пока что всё похоже на стандартное поведение для сишных программ.
koluna
1) Заполнение буфера.
2) Вызов sys.stdout.flush().
3) Разрушение объекта stdout (завершение программы).
Всё таки разрушение объекта и завершение программы - это разные вещи. При нормальном завершении программы любая сишная программа выталкивает потоки по стандарту.
Но удаление объекта тоже выталкивает, это уже в питоне определено. Скорее всего он файл просто закрывает, а при закрытии буфер выталкивается.
koluna
а вот эта строка почему-то теряется и не выводится даже при завершении программы:
sys.stdout.write('qwerty\r')
У меня сразу выводится.