PDA

View Full Version : [Ubuntu-Python] (py)inotify.. comportamento non previsto


avastreg
08-11-2008, 23:47
Ciao a tutti!

Avrei bisogno di una mano con questo inotify.

Inotify per chi non lo sapesse è un "watcher" che in pratica osserva le modifiche effettuate in una cartella (modifica/cancellazione di file bla bla bla) e li riporta sotto forma di segnali (credo).

Pyinotify è il wrapper (ho detto bene?) di inotify scritto in python, che permette di gestire questi report con python.

Io sto usando questo pyinotify perchè voglio sapere quando amule ha completato un file e l'ha spostato dalla cartella dei temp a quelli di default per i download.

Ho fatto funzionare un po' tutto, infatti se manualmente creo (o rimuovo) dei file nella cartella osservata, il report avviene. Ma quando amule ci crea un file, non viene fatto nessun report :mbe: :(

Non riesco a capire dove sta l'inghippo..

Ecco il codice python (per completezza):

from pyinotify import WatchManager, Notifier, \
ThreadedNotifier, ProcessEvent, IN_DELETE, \
IN_CREATE

import MySQLdb

wm = WatchManager() # Watch Manager
mask = IN_DELETE | IN_CREATE # watched events

class PTmp(ProcessEvent):
def process_IN_CREATE(self, event):
print "Creating:", event.pathname
//faccio qualcosa

def process_IN_DELETE(self, event):
print "Removing:", event.pathname

p = PTmp()
notifier = Notifier(wm, p)
wdd = wm.add_watch('/home/alle/Downloaded', mask, rec=True)

notifier.loop()

helpp :stordita:

Il codice in realtà non è fondamentale, penso sia più un problema alla base di unix e di questo inotify (ed è per questo che non l'ho messo in Programmazione).. che ne pensate?

Gimli[2BV!2B]
09-11-2008, 16:42
Ho provato il tuo codice, ma per farlo funzionare ho dovuto fare varie modifiche, basandomi sulla documentazione e sull'esempio che ho trovato alla pagina ufficiale: pyinotify documentation (http://pyinotify.sourceforge.net/#Documentation), Brief Tutorial (http://pyinotify.sourceforge.net/#Brief_Tutorial).

Questo è lo script:
#!/usr/bin/python

from pyinotify import WatchManager, Notifier, \
ThreadedNotifier, ProcessEvent, EventsCodes

import os
#import MySQLdb

wm = WatchManager() # Watch Manager
mask = EventsCodes.IN_DELETE | EventsCodes.IN_CREATE # watched events

class PTmp(ProcessEvent):
def process_IN_CREATE(self, event):
print "Create: %s" % os.path.join(event.path, event.name)
# faccio qualcosa

def process_IN_DELETE(self, event):
print "Remove: %s" % os.path.join(event.path, event.name)

p = PTmp()
notifier = Notifier(wm, p)
wdd = wm.add_watch('/home/gimli/Desktop', mask, rec=True)

#notifier.loop()

while True: # loop forever
try:
# process the queue of events as explained above
notifier.process_events()
if notifier.check_events():
# read notified events and enqeue them
notifier.read_events()
# you can do some tasks here...
except KeyboardInterrupt:
# destroy the inotify's instance on this interrupt (stop monitoring)
notifier.stop()
break

Questo è il risultato creando e rimuovendo un file:gimli@altarf:~/Desktop$ ./notify
Create: /home/gimli/Desktop/temp
Remove: /home/gimli/Desktop/temp
^C

Non è che stai usando una versione vecchia e magari buggata?
Hai provato altre flag oltre alle IN_CREATE IN_DELETE? Per esempio mi sembrano attinenti gli IN_MOVE_QUALCOSA, poiché il mulo sposta i file dalla directory temporanea alla incoming.

P.S. non ho esplorato con cura tutto il codice (anche perché è la prima volta che tocco il python...), ho solo fatto le modifiche minime per farlo funzionare.

avastreg
10-11-2008, 00:04
grazie intanto per la risposta!

a me dava quel risultato, anche senza modifiche, ma si vede che nel postare il codice ho dimenticato un pezzo

cmq in effetti ho provato solo quelli, potrebbe proprio essere come dici tu

tento domani e poi aggiorno qui :D

avastreg
10-11-2008, 22:29
;24940584']

...

Non è che stai usando una versione vecchia e magari buggata?
Hai provato altre flag oltre alle IN_CREATE IN_DELETE? Per esempio mi sembrano attinenti gli IN_MOVE_QUALCOSA, poiché il mulo sposta i file dalla directory temporanea alla incoming.

P.S. non ho esplorato con cura tutto il codice (anche perché è la prima volta che tocco il python...), ho solo fatto le modifiche minime per farlo funzionare.

era proprio così.. solo che, anche se banale, non vedevo la soluzione :stordita:

cmq non sei l'unico che tocca per la prima volta il python :P