Portál AbcLinuxu, 5. května 2025 13:16

Dotaz: Python, Zjistovani novych souboru v adresari

30.3.2010 17:24 Ondrej Liska
Python, Zjistovani novych souboru v adresari
Přečteno: 451×
Odpovědět | Admin
Dobry den,

programuji v pythonu programek ktery by mel reagovat na vznik noveho souboru ve sepcifikovanem adrresari.

Zatim to delam tak, ze kazdou vterinu prohlizi obsah zadane slozky a pokud se tam objevi nejaky novy soubor tak porovnam soucasny timestamp a timestamp data modifikace souboru a pokud je soubor novejsi, vypisu ho.

Toto reseni vsak neni idealni. Je prosim nejaka inteligentnejsi reseni?

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

30.3.2010 18:19 Sten
Rozbalit Rozbalit vše Re: Python, Zjistovani novych souboru v adresari
Odpovědět | | Sbalit | Link | Blokovat | Admin
Řešení se jmenuje pyinotify
30.3.2010 18:33 Ondrej Liska
Rozbalit Rozbalit vše Re: Python, Zjistovani novych souboru v adresari
Mohl by mi prosim nekdo napsat jak pyinotify pouzit na tento konkretni problem? Nejak se v tom nemuzu vyznat a ten pyinotify zdrojak ma asi 2000 radku.
30.3.2010 18:50 chrono
Rozbalit Rozbalit vše Re: Python, Zjistovani novych souboru v adresari
Dokumentáciu si pozeral? (napr. príklad a konkrétne súbor tutorial_notifier.py)
30.3.2010 18:58 Ondrej Liska
Rozbalit Rozbalit vše Re: Python, Zjistovani novych souboru v adresari
jj, presne na ten jsem se dival, ale z neho mi nebylo jasne, jak potom nazev nove vytvoreneho souboru predam zpet do volajici metody urcite tridy. Jakym zpusobem je toto mozne?
30.3.2010 19:26 chrono
Rozbalit Rozbalit vše Re: Python, Zjistovani novych souboru v adresari
Musíš ten názov predať späť? Nestačí, aby si v tej triede HandleEvents zavolal funkciu, ktorá ten nový súbor nejako spracuje?
30.3.2010 19:36 Ondrej Liska
Rozbalit Rozbalit vše Re: Python, Zjistovani novych souboru v adresari
No potreboval bych ten nazev predat metode tridy, od niz mam jiz vytvorenou instanci. Takze pokud bych tu metodu volal primo z HandleEvents, tak bych tam zas potreboval nejak dostat odkaz na instanci te tridy.
30.3.2010 19:52 chrono
Rozbalit Rozbalit vše Re: Python, Zjistovani novych souboru v adresari
Kombinácia príkladov tutorial_notifier.py a daemon.py:
import pyinotify
import functools
import sys

wm = pyinotify.WatchManager()  # Watch Manager
mask = pyinotify.IN_CREATE  # watched events

class Trieda(object):
    def zobraz(self, pathname):
        print pathname

def on_loop(notifier, trieda):
    trieda.zobraz(notifier.pathname)

on_loop_func = functools.partial(on_loop, trieda=Trieda())
notifier = pyinotify.Notifier(wm, on_loop_func)
wdd = wm.add_watch('/tmp', mask, rec=True)

notifier.loop()
30.3.2010 20:15 Ondrej Liska
Rozbalit Rozbalit vše Re: Python, Zjistovani novych souboru v adresari
No ja to tam takto:
class mojeTrida:
    # moje trida, ktera ma na starosti danou akci nad soubory
    ...
    def monitorMode(dir)
        # Az po zavolani teto metody vim, ze uzivatel chce pouzit monitorovaci rezim
        # Tady nekde by melo byt to cekani na nove tvoreny soubor
        # Jakmile zjistim, ze mam novy soubor, vezmu jeho jmeno a zavolam metodu
        # __zpracujSoubor s parametrem nazev noveho souboru
        if mameNovySobor:
            self.__zpracujSoubor(file)


    def __zpracujSoubor(file)
        # zakladni metoda tridy, ktera provadi danou akci nad souborem

# ========= main =========

# Na zacatku programu pouze zalovam metodu na monitorovani slozky
inst = mojeTrida()
inst.monitorMode("/home/user/test")
30.3.2010 20:17 Ondrej Liska
Rozbalit Rozbalit vše Re: Python, Zjistovani novych souboru v adresari
Takze otazka zni, jak zakomponovat to Vase reseni do toho co jsem vyse uvedl?
30.3.2010 20:34 chrono
Rozbalit Rozbalit vše Re: Python, Zjistovani novych souboru v adresari
Môžeš vyskúšať napr. niečo takéto:
import pyinotify

class mojeTrida:
    def monitorMode(self, dir):
        wm = pyinotify.WatchManager()
        notifier = pyinotify.Notifier(wm, self.__process_event)
        wdd = wm.add_watch(dir, pyinotify.IN_CREATE, rec=True)
        notifier.loop()

    def __process_event(self, notifier):
        self.__zpracujSoubor(notifier.pathname)

    def __zpracujSoubor(self, file):
        print file

inst = mojeTrida()
inst.monitorMode("/tmp")
30.3.2010 21:23 Ondrej Liska
Rozbalit Rozbalit vše Re: Python, Zjistovani novych souboru v adresari
Ano, funguje to, dekuji. Jde nejak udelat i to, aby si pyinotify vsimal jen souboru specifikovanych nejakym filtrem? Videl jsem v prikladech ze je umi pomoci filtru vyloucit (exclude) tak podporuje i neco jako include?
30.3.2010 22:29 chrono
Rozbalit Rozbalit vše Re: Python, Zjistovani novych souboru v adresari
Také niečo to nepodporuje. Problém je, že (okrem iného) by to muselo testovať, či je ten objekt adresár a v takom prípade sa to nebude filtrovať (inak by sa kompletne zablokovalo kontrolovanie tých udalostí).

Asi najjednoduchšie bude pridať tú kontrolu do tej funkcie __process_event (urobil som to podobne, ako je to urobené v ExcludeFilter):
import pyinotify
import re

class mojeTrida:
    def monitorMode(self, dir):
        wm = pyinotify.WatchManager()
        notifier = pyinotify.Notifier(wm)
        incl_lst = ['.*/apache[0-9]+\.log', '.*~']
        self._lregex = []
        for regex in incl_lst:
            self._lregex.append(re.compile(regex, re.UNICODE))
        wdd = wm.add_watch(dir, pyinotify.IN_CREATE, rec=True, proc_fun=self.__process_event)
        notifier.loop()

    def __process_event(self, event):
        path = event.pathname
        for regex in self._lregex:
            if regex.match(path) is not None:
                self.__zpracujSoubor(path)
                break

    def __zpracujSoubor(self, file):
        print file

inst = mojeTrida()
inst.monitorMode("/tmp")
(možno by bolo lepšie, keby sa tie vzory predávali ako parameter funkcie monitorMode)
31.3.2010 00:42 Ondrej Liska
Rozbalit Rozbalit vše Re: Python, Zjistovani novych souboru v adresari
Dobry napad, dekuji.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.