Форум сайта python.su
0
Всем привет!
Не подскажите, где можно посмотреть на реализацию данного оператора (Python 2.x)?
Чем принципиально отличается вывод данных с помощью print от вывода данных через sys.stdout.write()?
Когда при работе с sys.stdout происходит вывод из буфера? Каков размер буфера?
Офлайн
857
kolunaВ исходниках.
Не подскажите, где можно посмотреть на реализацию данного оператора (Python 2.x)?
git://github.com/akheron/cpython.git
kolunaОн может вообще в другой поток выводить.
Чем принципиально отличается вывод данных с помощью print от вывода данных через sys.stdout.write()?
>>> import sys >>> >>> print >>sys.stderr, 'test' test >>>
>>> print 1, 2, 3 1 2 3 >>> sys.stdout.write(1, 2, 3) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: function takes exactly 1 argument (3 given) >>>
kolunaВообще - когда буфер заполняется, но можно и построчную буферизацию установить, и вообще отключить буфер.
Когда при работе с sys.stdout происходит вывод из буфера?
kolunaЗависит от системы, обычно ставят такой же, как и BUFSIZ в сишном компиляторе.
Каков размер буфера?
>>> import io >>> io.DEFAULT_BUFFER_SIZE 8192 >>>
Отредактировано py.user.next (Фев. 20, 2015 11:02:16)
Офлайн
0
py.user.next
В исходниках.

py.user.next
Он может вообще в другой поток выводить.
py.user.next
Вообще - когда буфер заполняется, но можно и построчную буферизацию установить, и вообще отключить буфер.
py.user.nextВ 2.7.9 тоже: https://docs.python.org/2/library/io.html
В третьем питоне
#!/usr/bin/python #-*- coding: utf-8 -*- import sys import io import time # Размер буфера ввода-вывода. print 'io.DEFAULT_BUFFER_SIZE =', io.DEFAULT_BUFFER_SIZE # Строка на экране появляется сразу. sys.stdout.write('string 1\r\n') time.sleep(3) # Строка на экране появляется через 6 секунд после запуска программы. sys.stdout.write('string 2') time.sleep(3)
Офлайн
0
Эти строки появляются на экране сразу (в них есть конец строки, т. к. у нас, судя по всему, строковая буферизация):
sys.stdout.write('string 1\r\n') sys.stdout.write('string 2\n')
sys.stdout.write('qwerty\r')
Офлайн
857
koluna
Да понятно, что в исходниках, я имел в виду конкретный файл
static stmt_ty
ast_for_print_stmt(struct compiling *c, const node *n)
koluna
Вот тут хотелось бы поподробнее…
koluna
Изменить размер буфера можно, присвоив io.DEFAULT_BUFFER_SIZE другое значение?
buffering is an optional integer used to set the buffering policy. Pass 0 to switch buffering off (only allowed in binary mode), 1 to select line buffering (only usable in text mode), and an integer > 1 to indicate the size of a fixed-size chunk buffer. When no buffering argument is given, the default buffering policy works as follows:
kolunaДля stdin и stdout включается полная буферизация, а строковая может быть включена для stderr.
Какая буферизация включена по умолчанию? Строковая?
Отредактировано py.user.next (Фев. 20, 2015 14:01:01)
Офлайн
0
py.user.next
Для stdin и stdout включается полная буферизация, а строковая может быть включена для stderr.

Офлайн
857
kolunaC89 (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.
#!/usr/bin/env python # coding: utf-8 import sys import time print 'a' time.sleep(5)
t.py > out.txt
kolunaСтроковая там, потому что обнаружен терминал.
Почему, если для stdout включена полная буферизация
kolunaВсё таки разрушение объекта и завершение программы - это разные вещи. При нормальном завершении программы любая сишная программа выталкивает потоки по стандарту.
1) Заполнение буфера.
2) Вызов sys.stdout.flush().
3) Разрушение объекта stdout (завершение программы).
kolunaУ меня сразу выводится.
а вот эта строка почему-то теряется и не выводится даже при завершении программы:sys.stdout.write('qwerty\r')
Отредактировано py.user.next (Фев. 20, 2015 23:09:42)
Офлайн
0
py.user.next
У меня сразу выводится.
Офлайн
857
>>> import sys >>> >>> sys.stdout.write('qwerty\r') >>> ty >>> sys.version_info (2, 6, 3, 'candidate', 1) >>>
kolunaА где выполняешь строку?
Не выводится ни при завершении, ни при использовании flush().
Офлайн
0
py.user.next
А где выполняешь строку?
>>> import sys >>> sys.stdout.write('qwerty\r') >>> ty >>> sys.version_info (2, 6, 5, 'final', 0)
Офлайн