Как избежать буферизации входного файла Python
Возможный дубликат:
Установка меньшего размера буфера для sys.stdin?
У меня есть скрипт Python (2.4/2.7), используя fileinput
читать из стандартного ввода или из файлов. Он прост в использовании и хорошо работает, за исключением одного случая:
tail -f log | filter.py
Проблема в том, что мой сценарий буферизирует входные данные, в то время как (по крайней мере, в этом случае) я хочу сразу увидеть его вывод. Кажется, это связано с тем, что fileinput использует readlines()
схватить его bufsize
стоит байтов, прежде чем он что-то делает. Я попытался использовать bufsize 1, и это, похоже, не помогло (что было несколько удивительно).
Я обнаружил, что могу написать такой код, который не буферизуется:
while 1:
line = sys.stdin.readline()
if not line: break
sys.stdout.write(line)
Проблема, связанная с этим, заключается в том, что я теряю функцию fileinput (а именно, он автоматически открывает все файлы, переданные моей программе, или stdin, если таковых нет, и может даже автоматически распаковывать входные файлы).
Итак, как я могу получить лучшее из обоих? В идеале это то, где мне не нужно явно управлять списком входных файлов (включая распаковку), и все же это не задерживает ввод при использовании "потокового" способа.
2 ответа
Попробуйте запустить python -u
; человек говорит, что это "заставит stdin, stdout и stderr быть полностью небуферизованными".
Вы можете просто изменить путь hashbang в первой строке filter.py
,
Ты пытался:
def hook_nobuf(filename, mode):
return open(filename, mode, 0)
fi = fileinput.FileInput(openhook=hook_nobuf)
Не проверено, но из чтения того, что делает параметр openhook и что передает 0, чтобы открыть параметр bufsize, это должно сработать.