Чтение обновленных файлов на лету в Python - PullRequest
2 голосов
/ 29 марта 2011

Я пишу два скрипта Python, которые обрабатывают оба файла.Один из них - стандартный файл журнала Unix, а другой - двоичный файл.Я пытаюсь найти лучший способ контролировать их, чтобы я мог читать данные, как только они обновляются.Большинство решений, которые я нашел до сих пор, относятся к Linux, но мне нужно это для работы во FreeBSD.

Очевидно, что одним из подходов было бы просто запускать мой скрипт каждые X раз, но это кажется грубым и неэффективным.Если я хочу, чтобы мое приложение Python непрерывно работало в фоновом режиме, отслеживая файл и воздействуя на него после его изменения / обновления, какова моя лучшая ставка?

Ответы [ 2 ]

2 голосов
/ 30 марта 2011

Вы пробовали события KQueue?

http://docs.python.org/library/select.html#kqueue-objects

kqueue - это версия inotify для FreeBSD / OS (служба уведомлений об изменении файла).Я не использовал это, но я думаю, что это то, что вы хотите.

2 голосов
/ 29 марта 2011

Я однажды сделал что-то вроде процесса демона для парсера, встроенного в Python. Мне нужно было просмотреть серию файлов и обработать их на Python, и это должно было быть действительно решение для нескольких ОС (в данном случае Windows & Linux). Я написал программу, которая следит за списком файлов, проверяя время их изменения. Программа некоторое время спит, а затем проверяет время изменения просматриваемых файлов. Если время модификации новее зарегистрированного ранее, файл изменился, и с этим файлом нужно что-то делать.

Примерно так:

import os
import time

path = os.path.dirname(__file__)
print "Looking for files in", path, "..."

# get interesting files
files = [{"file" : f} for f in os.listdir(path) if os.path.isfile(f) and os.path.splitext(f)[1].lower() == ".src"]
for f in files:
    f["output"] = os.path.splitext(f["file"])[0] + ".out"
    f["modtime"] = os.path.getmtime(f["file"]) - 10
    print "  watching:", f["file"]


while True:
    # sleep for a while
    time.sleep(0.5)
    # check if anything changed
    for f in files:
        # is mod time of file is newer than the one registered?
        if os.path.getmtime(f["file"]) > f["modtime"]: 
            # store new time and...
            f["modtime"] = os.path.getmtime(f["file"])
            print f["file"], "has changed..."
            # do your stuff here

Это не похоже на первоклассный код, но работает довольно хорошо.

Есть другие ТАК вопросы по этому поводу, но я не знаю, дадут ли они прямой ответ на ваш вопрос:

Как реализовать питонический эквивалент tail -F?

Как посмотреть файл на предмет изменений?

Как я могу "посмотреть" файл для модификации / изменения?

Надеюсь, это поможет!

...