В настоящее время я пытаюсь найти способ, чтобы поток записывал логи в файл, а другой поток читал и обрабатывал их.Я нашел способ (часть 5) для непрерывного чтения данных в файле, но у меня проблема с записью файла в данные.
Когда я пытаюсь что-то записатьв файле мне нужно закрыть его позже, иначе файл останется пустым.Но если я закрою файл, я больше не смогу его прочитать.Таким образом, мой поток чтения выглядит так:
def follow(file):
file.seek(0,0)
while True:
line = file.readline()
if not line:
time.sleep(0.1)
continue
yield line
file = open(self.path)
loglines = follow(self.file)
for line in loglines:
print(line)
Но для записи я использовал что-то вроде:
file = open(self.path, 'w')
file.write(self.generateLog())
file.close()
sleep(self.duration)
Но, как только вызывается file.close (), у меня естьошибка в части чтения:
line 38, in run
for line in loglines:
line 147, in follow
line = file.readline()
ValueError: I/O operation on closed file.
Но если я не закрываю файл после записи, он никогда не обновляется.(Я просто делаю часть записи, чтобы убедиться, что часть чтения работает. Теоретически файл журнала будет обновляться с помощью apache или чего-то еще.)
РЕДАКТИРОВАТЬ: Благодаря flush (), ябольше нет этой проблемы, спасибо большое!Но кажется, что писать и читать может быть трудно.Если я печатаю строку, которую я пишу, и ту, которую я читаю, я получаю что-то вроде:
Writing : 158.228.210.37 [...] "GET /cat/rzkpvwons HTTP/1.0" 505 1119
Reading : 5 1119
Таким образом, чтение не читает всю строку.Есть идеи о проблеме?
РЕДАКТИРОВАТЬ 2: Просто изменение open (путь, 'w') на открытие (путь, 'a +'), кажется, работает в сочетании с сбросом, следовало подумать об этом раньше.Большое спасибо!
Большое спасибо, Джаз