Hallo
Ich möchte ein script schreiben das in einen Ordner schaut und wenn da ein Skript reinkopiert wird soll es ein anderes skript auslösen.
Weiss jemand wie dieser befehl geht?.
mit freundlichen Grüssen Willhelm
Auslösen wenn file in Ordner abgelegt wird
@Willhelm: Einen Befehl gibt es dafür nicht. Unter welchem Betriebssystem soll das denn passieren?
- Käptn Haddock
- User
- Beiträge: 169
- Registriert: Freitag 24. März 2006, 14:27
Du mußt das Verzeichnis auslesen, das Ergebnis mit dem vorigen Vergleichen und wenn es sich geändert hat eine Aktion auslösen. Dann mußt du den neuen Zustand speichern. Oder du merkst dir den Zeitpunkt des letzten Durchlaufs und prüfst ob das Änderungsdatum einer Datei jünger ist.
Das ganze ruftst du per cronjob regelmässig auf. Einen speziellen Befehl gibts dafür nicht.
Gruß Uwe
Das ganze ruftst du per cronjob regelmässig auf. Einen speziellen Befehl gibts dafür nicht.
Gruß Uwe
---------------------------------
have a lot of fun!
have a lot of fun!
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Unter Linux gibt es inotify und mit pyinotify ein Python Frontend.
Wenn du das selbst machen willst, schau dir zumindest die Module os und os.path an.
Wenn du das selbst machen willst, schau dir zumindest die Module os und os.path an.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Ob das besser waere kommt ganz auf die Anforderungen an. Will man beispielsweise echte Nebenlaeufigkeit, kommt man um neue Prozesse nicht herum .. ob durch `multiprocessing` oder eben `subprocess`. Zu erwaehnen ist dann noch `sys.executable` mit dem man an den Pfad des Interpreters kommt, der den aktuellen Prozess ausfuehrt.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
Ok Danke für die Antworten.
ich habe mal was zusammen geschustert.
das pifacedigitalio ist eine aufsteck platine mit 2 relais. die mit p.digital_write(0,1) eingeschaltet werden.
ich habe es aus probiert aber es funktioniert nicht sieht jemand wo der fehler ist?
im verzeichniss /home/pi/Watchit ist der ordner der auslösen soll.
da währe ich sehr dankbar.
mit freundlichen grüssen Willhelm
ich habe mal was zusammen geschustert.
das pifacedigitalio ist eine aufsteck platine mit 2 relais. die mit p.digital_write(0,1) eingeschaltet werden.
ich habe es aus probiert aber es funktioniert nicht sieht jemand wo der fehler ist?
im verzeichniss /home/pi/Watchit ist der ordner der auslösen soll.
Code: Alles auswählen
#!/usr/bin/python
import pifacedigitalio as p
import pyinotify,subprocess
p.init()
def onChange(ev):
p.digital_write(0,1) = ['/bin/echo', '/home/pi/Watchit', ev.pathname, 'changed']
subprocess.Popen(p.digital_write(0,1)).communicate()
wm = pyinotify.WatchManager()
wm.add_watch('/home/pi/Watchit', pyinotify.IN_modify, onChange)
notifier = pyinotify.notifier(wm)
notifier.loop()
mit freundlichen grüssen Willhelm
Zuletzt geändert von Hyperion am Dienstag 11. Februar 2014, 09:44, insgesamt 1-mal geändert.
Grund: Code in Python-Code Block gesetzt. Syntax-Fehler in Zeile 6 gefixt.
Grund: Code in Python-Code Block gesetzt. Syntax-Fehler in Zeile 6 gefixt.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Ich habe einen Syntax-Fehler in Zeile 6 gefixt - lag es daran?Willhelm hat geschrieben: ich habe es aus probiert aber es funktioniert nicht sieht jemand wo der fehler ist?
Du solltest *immer* eine genaue Beschreibung geben, woran Du festmachst, dass etwas nicht klappt! (Kommt ein Fehler? Wenn ja, Meldung hier posten! Erwartest Du ein anderes Ergebnis? Wenn ja, wieso und was kommt stattdessen? usw.)
Bitte setze Code doch in die dafür vorgesehenen Tags! Bei Python-Code ist das doppelt wichtig, da ansonsten die Einrückungen verloren gehen und Dein Code somit nicht mehr leicht gelesen und getestet werden kann.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
@Willhelm: Jetzt weiss ich nicht mehr wer den Fehler gemacht hat, aber Zeile 6 ist immer noch nichts was der Compiler versteht, also ein Syntaxfehler. Und das sagt der Compiler auch sehr deutlich wenn man versucht das auszuführen.
ok Danke
es sagt in zeile 7 inconsistent use of tabs and spaces in indentation (hinter communicate() )
Code: Alles auswählen
#!/usr/bin/python
import pifacedigitalio as p
import pyinotify,subprocess
p.init()
def onChange(ev):
p.digital_write(0,1) = ['/bin/echo', '/home/pi/Watchit', ev.pathname, 'changed']
subprocess.Popen(p.digital_write(0,1)).communicate()
wm = pyinotify.WatchManager()
wm.add_watch('/home/pi/Watchit', pyinotify.IN_MODIFY, onChange)
notifier = pyinotify.notifier(wm)
notifier.loop()
@Willhelm: Das glaube ich nicht weil in der Zeile davor schon ein Syntaxfehler ist über den der Compiler nicht hinweg kommt.
Was die Leerzeichen/Tab-Meldung angeht: Verwende nur Leerzeichen und keine Tabs. Und zwar vier Leerzeichen pro Einrückebene per Konvention.
Und dann erklär doch mal was Du denkst was die Zeilen 6 und 7 bedeuten, also was das im einzelnen in den Teilausdrücken passiert.
Was hast Du letztendlich denn eigentlich vor? Denn das ``echo`` kann es ja nicht sein. Python kennt eine ``print``-Anweisung.
Was die Leerzeichen/Tab-Meldung angeht: Verwende nur Leerzeichen und keine Tabs. Und zwar vier Leerzeichen pro Einrückebene per Konvention.
Und dann erklär doch mal was Du denkst was die Zeilen 6 und 7 bedeuten, also was das im einzelnen in den Teilausdrücken passiert.
Was hast Du letztendlich denn eigentlich vor? Denn das ``echo`` kann es ja nicht sein. Python kennt eine ``print``-Anweisung.
ok ich habe statt tabs 4 leerzeichen verwendet und jetzt kommt er mit can`t assign to function call.
Ich habe vor wenn ich was in einen Ordner lege soll er ein Relay schalten .
die befehle für das relay
Import pifacedigitalio as p
p.init()
p.digital_write(0,1)
ok ich habe noch mals alles rausgeschmissen was individualisiert wurde.
Ich habe vor wenn ich was in einen Ordner lege soll er ein Relay schalten .
die befehle für das relay
Import pifacedigitalio as p
p.init()
p.digital_write(0,1)
ok ich habe noch mals alles rausgeschmissen was individualisiert wurde.
Code: Alles auswählen
import pyinotify,subprocess
def onChange(ev):
cmd = ['/bin/echo', 'File', ev.pathname, 'changed']
subprocess.Popen(cmd).communicate()
wm = pyinotify.WatchManager()
wm.add_watch('file.watched', pyinotify.IN_MODIFY, onChange)
notifier = pyinotify.Notifier(wm)
notifier.loop()
@Willhelm: Ich habe so ein bisschen das Gefühl Du nimmst fertige Quelltextschnippsel die Du nicht verstehst und probierst dann wild herum. So funktioniert programmieren nicht. Man sollte schon verstehen wie Grundlagen der Sprache funktionieren, zum Beispiel sollte eigentlich klar sein warum Deine Zeile 6 einfach keinen Sinn macht. Und dann die verwendeten Bibliotheken. Bei `pyinotify` muss man sich mal durch die Dokumentation arbeiten und wohl auch durch die von der inotify-API selbst um zu verstehen wie das funktioniert und auch was die Werte bedeuten die man da bei den Funktionen/Methoden angeben kann. IN_MODIFY ist zum Beispiel für Deinen Fall nicht das richtige.
Bei der Beschreibung was Du erreichen willst, sehe ich nicht wofür man `subprocess` benötigt‽
Bei der Beschreibung was Du erreichen willst, sehe ich nicht wofür man `subprocess` benötigt‽
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Wenn du nur das Relay schalten willst, dann mach doch auch nur das:
Wobei du vielleicht besser auf `pyinotify.IN_CREATE` achten solltest statt auf `pyinotify.IN_MODIFY`. Letzteres wird auch bei jeder Aenderung (evtl auch Loeschung?) aufgerufen.
Code: Alles auswählen
import pifacedigitalio as p
import pyinotify
p.init()
def onChange(ev):
p.digital_write(0,1)
wm = pyinotify.WatchManager()
wm.add_watch('/home/pi/Watchit', pyinotify.IN_MODIFY, onChange)
notifier = pyinotify.notifier(wm)
notifier.loop()
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte