Проблема Python с отслеживанием постоянно обновляемого файла журнала

Я пытаюсь отследить файл журнала, который создается другой запущенной программой. Я хотел бы вернуть True, если в обновленном журнале найдено слово "день" (что означает, что другой код успешно выполнен). Проблема в том, что иногда другая программа не имеет успеха и просто застревает в одной строке, и я хотел бы вернуть false, если это произойдет. Я попытался отследить, если он застрял на одной и той же строке, используя seek() и tell() следующим образом:

def is_successful_test(self):
    '''
    checks if external code was successful
    '''
    day_out = os.path.join(self.working_dir, 'day.out')
    day_out = open(day_out)
    i = 0

    while True:
            day_out.seek(i)
            latest_line = day_out.readline()
            i_old = dat_out.tell()
            if 'day' in latest_line:
                    return True
            time.sleep(60)
            i = aims_out.tell()
            if i == i_old:
                    self.output("day file not updating")
                    break
    return False

Но это всегда возвращает одно и то же для i и i_old и всегда возвращает false, когда журнал действительно все еще обновляется (вероятно, я не делаю это правильно, я новичок). Это также вернуло то же самое, когда я попытался отследить размер файла (используя os.stat).

Я также пытался использовать,

def is_successful(self):
    '''
    checks if external code was successful
    '''
    day_out = os.path.join(self.working_dir, 'day.out')
    day_out = open(day_out,"r")
    while True:
            line = day_out.readline()
            if line == '':
                    break
            if 'day' in line:
                    day_out.close()
                    return True
    day_out.close()
    return False

Это хорошо работает, когда другая программа запускается очень быстро, но кажется, что время ожидания истекает и возвращает false, если код выполняется слишком долго.

Я в некотором роде озадачен тем, почему я не могу найти последовательное решение. Отслеживание размера или строки файла или даже разницы во времени кажется хорошей идеей, но я не могу реализовать ее. Я хотел бы найти самое простое решение, не загружая что-то вроде сторожевого пса, который я видел в других постах. Любая помощь будет оценена! Благодарю.

1 ответ

Решение

Вы пытаетесь использовать seek а также tell способами, которые не имеют смысла: tell просто верните смещение позиции в текущем открытом файле (в текущем процессе) - он не вернет другое число, если файл был снова открыт в другом процессе, и этот экземпляр открытого файла находится в другой позиции. Если до звонка tell вы выпускаете seek попросить курсор поместить в конец файла:day_out.seek(0, OS.SEEK_END), Но ваша идея настолько запутана, что не сработает.

За то, что вы хотите, вы можете просто продолжать выпускать readline в вашем файле: если вы находитесь в конце файла, вы получите пустую строку. Если другой процесс написал дополнительные строки из точки, в которой находится курсор, будет получена следующая строка.

counter = 0
while True:
   line = day_out.readline()
   if "day" in line:
      do_things()
      counter = 0
   elif line == '':
      time.sleep(60)
      counter += 1
   if counter > 5:
       output("day file not updating")
Другие вопросы по тегам