Portál AbcLinuxu, 11. května 2025 10:09
tail -f
). Zkoušel jsem to přes fork a semafor, ale dostal jsem tip, že by se to mělo nějak dát udělat přes MainLoop() - to je koneckonců smyčka, která by měla zavolat určitou funkci kontrolující soubor.
Ale zatím jsem nenašel "obecný" postup, jak toho dosáhnout. Programátor nejsem, netuším, po čem vlastně pátrám.
Používám wxPython (ale postup asi bude obecný pro jaký koliv toolkit), část kódu:
class Monitor(wx.App): def OnInit(self): init GUI [....] def watcher(self): if zmena_v_souboru: zmena_v_gui def main(): pymonitor = Monitor(0) pymonitor.MainLoop() main()Jak na to? Díky
#!/usr/bin/env python import sys, os, select, fcntl, signal SEEK_SET, SEEK_CUR, SEEK_END = 0, 1, 2 bufsize = 4096 def handler_SIGIO(a, b): pass def dump_to_end(fd): while True: chunk = os.read(fd, bufsize) if not chunk: break sys.stdout.write(chunk) fd = os.open(sys.argv[1], os.O_RDONLY) signal.signal(signal.SIGIO, handler_SIGIO) filepos = 0 while True: os.lseek(fd, filepos, SEEK_SET) dump_to_end(fd) filepos = os.lseek(fd, 0, SEEK_CUR) print filepos fcntl.fcntl(fd, fcntl.F_SETLEASE, fcntl.F_RDLCK) signal.pause()Dá se to udělat i jinak? Nevýhodou je to šaškování se signálem a volání pause()
#!/usr/bin/env python import pygtk pygtk.require('2.0') import gtk, gobject, stat, os, sys class WatchFile: def __init__(self, filename): self.filename = filename self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) self.window.connect('delete_event', self.delete_event) self.window.connect('destroy', self.quit) self.checkbut = gtk.CheckButton('File "%s" has changed' %filename) self.checkbut.show() self.times = (None, None, None) self.has_changed() gobject.timeout_add(1000, self.periodic_check, None) self.window.add(self.checkbut) self.window.show() def periodic_check(self, object): if self.has_changed(): self.checkbut.set_active(1) return True def has_changed(self): sr = os.lstat(self.filename) t = (sr.st_atime, sr.st_mtime, sr.st_ctime) if t != self.times: self.times = t return True else: return False def delete_event(self, widget, data): return False def quit(self, widget, data = None): gtk.main_quit() def main(self): gtk.main() if __name__ == '__main__': wtch = WatchFile(sys.argv[1]) wtch.main()Tohle ukáže checkbox, který se automaticky zaškrtne při každé změně souboru. Odšktrnutí jsem ponechal na uživateli, ať si klikne myší. Každou sekundu to kontroluje všechny tři časy u souboru. Jádrem pudla je timeout_add, o kterém psal Petr Mach.
self.timer = wx.wxPyTimer(self.watcher) self.timer.Start(1000) self.watcher() # to je ta funkce, která to celé děláčerpal jsem z roota (cirkus s okny) dík za nasměrování správným směrem.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.