хвост-f в Python без time.sleep

Вт/отражение, поскольку я не знал об апачской библиотеке:

(знать, что, если Вы делаете это, необходимо будет, вероятно, иметь дело с подобъектами и удостовериться, что они печатают правильно - в частности, массивы не покажут Вам ничего полезного)

@Override
public String toString()
{
    StringBuilder b = new StringBuilder("[");
    for (Field f : getClass().getFields())
    {
        if (!isStaticField(f))
        {
            try
            {
                b.append(f.getName() + "=" + f.get(this) + " ");
            } catch (IllegalAccessException e)
            {
                // pass, don't print
            }
        }
    }
    b.append(']');
    return b.toString();
}


private boolean isStaticField(Field f)
{
    return Modifier.isStatic(f.getModifiers());
}
25
задан 25 September 2009 в 07:45
поделиться

6 ответов

(update) Either use FS monitors tools

Or a single sleep usage (which I would you consider as much more elegant).

import time
def follow(thefile):
    thefile.seek(0,2)      # Go to the end of the file
    while True:
         line = thefile.readline()
         if not line:
             time.sleep(0.1)    # Sleep briefly
             continue
         yield line

logfile = open("access-log")
loglines = follow(logfile)
for line in loglines:
    print line
33
ответ дан 28 November 2019 в 20:47
поделиться

При чтении из файла ваш единственный выбор - спать ( см. Исходный код ). Если вы читаете из канала, вы можете просто читать, поскольку чтение будет блокироваться до тех пор, пока не будут готовы данные.

Причина этого в том, что ОС не поддерживает понятие «ждать, пока кто-нибудь напишет в файл». Совсем недавно некоторые файловые системы добавили API, где вы можете отслеживать изменения, внесенные в файл, но tail слишком стар для использования этого API, и он также доступен не везде.

10
ответ дан 28 November 2019 в 20:47
поделиться

IMO you should use sleep, it works on all platform and code will be simple

Otherwise you can use platform specific APIs which can tell you when file change e.g. on window use FindFirstChangeNotification on folder and watch for FILE_NOTIFY_CHANGE_LAST_WRITE events

On linux i think you can use i-notify

On Mac OSX use FSEvents

0
ответ дан 28 November 2019 в 20:47
поделиться

Вы можете увидеть здесь , как сделать "tail -f", как при использовании inotify:

Это пример [sic], чтобы показать, как использовать inotify модуль, это может быть очень полезно без изменений.

Экземпляр Watcher позволяет вам определять обратные вызовы для любого события, которое происходит в любом файле, каталоге и подкаталогах.

Модуль inotify взят из рецепта 576375

0
ответ дан 28 November 2019 в 20:47
поделиться

Если вы можете использовать GLib на всех платформах, вам следует использовать glib.io_add_watch ; тогда вы можете использовать обычный основной цикл GLib и обрабатывать события по мере их возникновения, без какого-либо опроса.

http://library.gnome.org/devel/pygobject/stable/glib-functions.html#function-glib-- io-add-watch

-2
ответ дан 28 November 2019 в 20:47
поделиться

Why don't you just use subprocess.call on tail itself?

subproces.call(['tail', '-f', filename])

Edit: Fixed to eliminate extra shell process.

Edit2: Fixed to eliminate deprecated os.popen and thus the need to interpolate parameters, escape espaces and other stuff, and then run a shell process.

-2
ответ дан 28 November 2019 в 20:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: