Вт/отражение, поскольку я не знал об апачской библиотеке:
(знать, что, если Вы делаете это, необходимо будет, вероятно, иметь дело с подобъектами и удостовериться, что они печатают правильно - в частности, массивы не покажут Вам ничего полезного)
@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());
}
(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
При чтении из файла ваш единственный выбор - спать ( см. Исходный код ). Если вы читаете из канала, вы можете просто читать, поскольку чтение будет блокироваться до тех пор, пока не будут готовы данные.
Причина этого в том, что ОС не поддерживает понятие «ждать, пока кто-нибудь напишет в файл». Совсем недавно некоторые файловые системы добавили API, где вы можете отслеживать изменения, внесенные в файл, но tail слишком стар для использования этого API, и он также доступен не везде.
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
Вы можете увидеть здесь , как сделать "tail -f", как при использовании inotify:
Это пример [sic], чтобы показать, как использовать inotify модуль, это может быть очень полезно без изменений.
Экземпляр Watcher позволяет вам определять обратные вызовы для любого события, которое происходит в любом файле, каталоге и подкаталогах.
Модуль inotify взят из рецепта 576375
Если вы можете использовать GLib на всех платформах, вам следует использовать glib.io_add_watch
; тогда вы можете использовать обычный основной цикл GLib и обрабатывать события по мере их возникновения, без какого-либо опроса.
http://library.gnome.org/devel/pygobject/stable/glib-functions.html#function-glib-- io-add-watch
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.