Portál AbcLinuxu, 4. listopadu 2025 06:34
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() 
            
, pokud si je explicitně neuděláš (třeba přes rouru). Není lepší použít vlákna?
            
#!/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.