Suche FileSystemWatcher in Python für Windows

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
dor_neue
User
Beiträge: 74
Registriert: Montag 16. Juni 2008, 18:51

Montag 7. Juli 2008, 15:27

Hallo,

in VB.Net gibt es so ein kleines Tool Namens FileSystemWatcher - genau sowas suche ich für Python.
Ich hab zwar im Moment eine Möglichkeit in dem ich es in Intervallen prüfe, aber da hab ich das Problem:
entweder is der Zeitabstand zu hoch und das Script brauch zu lange bis es reagiert oder
der Zeitabstand is zu kurz und ich hab eine zu hohe Systembelastung im Leerlauf...

Wer kann mir nen Tipp geben wo ich suchen muss?!?

THX!!
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

Montag 7. Juli 2008, 20:30

Wie wärs mit selber schreiben ...

je nachdem auf was (neue files, files ändern etc) du prüfen willst ist das relativ simpel.
dor_neue
User
Beiträge: 74
Registriert: Montag 16. Juni 2008, 18:51

Dienstag 8. Juli 2008, 07:35

Mad-Marty hat geschrieben:Wie wärs mit selber schreiben ...

je nachdem auf was (neue files, files ändern etc) du prüfen willst ist das relativ simpel.
Wie gesagt, ich hab es schon selber geschrieben - Problem dabei ist ja das:
Ich will reagieren wenn eine neue Datei dazugekommen ist. Ich kenn den Dateinamen der kommt und alles. Also prüfe ich den Verzeichnissinhalt in regelmäßigen Abständen. Soweit kein Problem - aber ich brauhc eine Zeitnahe Reaktion (Reaktionszeit <= 0.5 sec)
D.H. mein Script prüft aller 0.5 sec den Verzeichnissinhalt - auch das klappt. Problem dabei ist, das es sich hierbei um einen Server handelt und ich mit diesem Script eine unnötige und überflüssige Belastung des Servers hervorrufe. Das is Sch****...
Also - entweder ich hab eine schlechtere Reaktionszeit oder ich belaste unseren Server zu stark.
Deshalb suche ich sowas wie den FileSystemWatcher für Python...

Ich hab ne Zeitlang VB.Net programmiert gehabt und kenne dieses Tool aus der .Net Sammlung. Mit dem hab ich auch definitiv nicht eine so hohe Systemauslastung im Leerlauf wie mit meinem Script. Ich will aber nicht 2 Programmiersprachen mischen und hab mich nun für Python entschieden gehabt. Also - entweder ich realisiere alles in VB.Net (was aber nicht unbedingt möglich ist) oder ich muss eine Möglichkeit finden, das in Python zu realisieren.
n4p
User
Beiträge: 55
Registriert: Dienstag 10. Juni 2008, 11:05

Dienstag 8. Juli 2008, 07:57

Vielleicht hilft das hier?
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Dienstag 8. Juli 2008, 08:07

Hi

Hier hab ich das mit der WinApi gelöst:
http://www.python-forum.de/post-97302.html#97302

Gruss
dor_neue
User
Beiträge: 74
Registriert: Montag 16. Juni 2008, 18:51

Dienstag 8. Juli 2008, 08:33

rayo hat geschrieben:Hi

Hier hab ich das mit der WinApi gelöst:
http://www.python-forum.de/post-97302.html#97302

Gruss
@rayo:
Fehlermeldung:
D:\Ressourcen\PyScripte\test2.py:49: FutureWarning: hex/oct constants > sys.maxint will return positive values in Py
thon 2.4 and up
INFINITE = 0xFFFFFFFF
Traceback (most recent call last):
File "D:\CreatePDF\Ressourcen\PyScript\test2.py", line 4, in ?
import ctypes
ImportError: No module named ctypes

Da ich aber OpenOffice als Python-Interpreter nutzen will (muss) wird das doof...
Trotzdem danke!!

@n4p:
Danke - mal sehen - erstmal kapier ich das nicht - aber da fitze ich mich rein...
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Dienstag 8. Juli 2008, 09:11

Hallo auch
dor_neue hat geschrieben:... Deshalb suche ich sowas wie den FileSystemWatcher für Python ...
Für eine Python hast du ja ein Beispiel (mit ctypes) bekommen. Das Du OpenOffice benutzt ist Dein Problem ;). Benutze eine saubere Python Umgebung wäre hier mein Rat.
... Ich hab ne Zeitlang VB.Net programmiert gehabt und kenne dieses Tool aus der .Net Sammlung. Mit dem hab ich auch definitiv nicht eine so hohe Systemauslastung im Leerlauf wie mit meinem Script. ...
Halt eine Stärke von .NET - es kommt aus dem Hause MS und hat dort eindeutig Heimvorteil.
... Ich will aber nicht 2 Programmiersprachen mischen und hab mich nun für Python entschieden gehabt. Also - entweder ich realisiere alles in VB.Net (was aber nicht unbedingt möglich ist) oder ich muss eine Möglichkeit finden, das in Python zu realisieren. ...
Da Du IMO keine wirklich "standard" Python Umgebung zu nutzten gewillt bist und die .NET FileSystemWatcher (http://msdn.microsoft.com/de-de/library ... S.80).aspx) weit aus performanter als jede mit ´standard´ Python zu realisierende Scriptlösung sein wird ;) , würde ich Dir empfehlen Dein Vorhaben vorzugsweise dann ganz in VB.NET zu implementieren.

Gruss,
>>Masaru<<
dor_neue
User
Beiträge: 74
Registriert: Montag 16. Juni 2008, 18:51

Dienstag 8. Juli 2008, 14:20

Das Du OpenOffice benutzt ist Dein Problem ;). Benutze eine saubere Python Umgebung wäre hier mein Rat.
OpenOffice muss es leider sein, da ich nur dort Zugriff auf die Lib UNO hab und nur dort den Zugriff auf OpenOffice mittels Python realisieren kann...
... Halt eine Stärke von .NET - es kommt aus dem Hause MS und hat dort eindeutig Heimvorteil. ...

Hab IronPython gefunden - ein Interpreter mit dem man mit Python auf das .Net-Framework zugreifen kann...
Problem dabei - ich müsste den Systemwatcher im IronPython und den Rest im OpenOffice Python machen - also 2 Python-Interpreter am Laufen haben... Das is doof...
... Da Du IMO keine wirklich "standard" Python Umgebung zu nutzten gewillt bist ...

Wollen schon - aber ich kann nicht, da ich an OpenOffice gebunden bin - mir wäre nen richtiger Python-Interpreter auch lieber, zu mal der von OpenOffice nur die Version 2.2.1 bietet...
... und die .NET FileSystemWatcher (http://msdn.microsoft.com/de-de/library ... S.80).aspx) weit aus performanter als jede mit ´standard´ Python zu realisierende Scriptlösung sein wird ;) , würde ich Dir empfehlen Dein Vorhaben vorzugsweise dann ganz in VB.NET zu implementieren. ...
1. Hab ich mich aus verschiedenen Gründen jetzt einmal gegen VB.Net entschieden
2. Will ich eigentlich nicht das ganze Script nochmal schreiben (inklusive Anbindung an OpenOffice)

ich hab es jetzt über isfile() realisiert, da ich damit wesentlich weniger Systemauslaustung als mit open() erreiche und die Auswertung gemütlich per if-Abfrage lösen kann und nicht über Exceptions...

Wie auch immer - Wenn einem doch noch was einfällt, immer her damit...
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Dienstag 8. Juli 2008, 15:49

Hum ... also auch mit "os.path.isfile" hast Du ja nicht so das richtige, was man mit dem FileSystemWatcher hat.

Ähm ... hier ein kleines Beispielscript, was Du ja vielleicht mal ausprobieren kannst:

Code: Alles auswählen

import os
import time

def get_state(directory):
    state = {}
    for root, dirs, files in os.walk(directory):
        for f in files:
            path = os.path.join(root, f)
            state[path] = os.path.getmtime(path)
        break  #remove this, and you'll have a recursively directory scan
    return state


watch_dir = os.getcwd() #exchange this for watch an other root directory
cache = get_state(watch_dir) #initial cache building
while True:
    state = get_state(watch_dir)
    for f,m in state.iteritems():
        if cache != state: #something changed
           if cache.keys() == state.keys():
               for f,m in state.iteritems():
                   if m != cache[f]:
                       print "File changed:", f
           else:
               removed = [ f for f in cache.keys() if f not in state.keys() ]
               added = [ f for f in state.keys() if f not in cache.keys() ]
               for f in removed:
                   print "File removed:", f
               for f in added:
                   print "File added:", f
        cache = state
    time.sleep(0.5)
Ich habe das Script einfach mal in meinem E:\tmp Verzeichnis gestartet und dann ein wenig erstellt, gelöscht und modifiziert ... und es klappte recht gut.

Code: Alles auswählen

E:\tmp>test.py
File removed: E:\tmp\test.txt
File added: E:\tmp\python.txt
File removed: E:\tmp\python.txt
File added: E:\tmp\rename_test.txt
File changed: E:\tmp\test.py
Nur nimm am besten nicht das break in Zeile 10 raus, sonst wird rekursiv über den gesamtem root_dir Verzeichnisbaum das State-Dictionary gebaut ... und "das" könnte dann doch ein wenig Perfomance fressend sein (je nach Verschachtelungs-Tiefe und Anzahl der dortigen Dateien).

Gruss,
>>Masaru<<
Antworten