Вы можете полностью удалить буферизацию из stdin / stdout, используя -u
флаг python:
-u : unbuffered binary stdout and stderr (also PYTHONUNBUFFERED=x)
see man page for details on internal buffering relating to '-u'
, и страница руководства уточняет:
-u Force stdin, stdout and stderr to be totally unbuffered. On
systems where it matters, also put stdin, stdout and stderr in
binary mode. Note that there is internal buffering in xread-
lines(), readlines() and file-object iterators ("for line in
sys.stdin") which is not influenced by this option. To work
around this, you will want to use "sys.stdin.readline()" inside
a "while 1:" loop.
Помимо этого, изменяя буферизациюсуществующий файл не поддерживается, но вы можете создать новый файловый объект с тем же базовым файловым дескриптором, что и существующий, и, возможно, другой буферизацией, используя os.fdopen .Т.е.,
import os
import sys
newin = os.fdopen(sys.stdin.fileno(), 'r', 100)
должен связывать newin
с именем файлового объекта, который читает тот же FD, что и стандартный ввод, но буферизуется только около 100 байтами за раз (ивы можете продолжить с sys.stdin = newin
, чтобы использовать новый файловый объект в качестве стандартного ввода и далее).Я говорю «должен», потому что эта область использовала , чтобы иметь ряд ошибок и проблем на некоторых платформах (довольно сложно обеспечить кроссплатформенность с полной общностью) - я не уверен, каково ее состояниесейчас, но я бы определенно рекомендовал провести тщательное тестирование на всех интересующих платформах, чтобы убедиться, что все идет гладко.(-u
, полностью удаляя буферизацию, должно работать с меньшим количеством проблем на всех платформах, если это может удовлетворить ваши требования).