Auslösen wenn file in Ordner abgelegt wird

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.
Willhelm
User
Beiträge: 26
Registriert: Montag 10. Februar 2014, 09:06

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
BlackJack

@Willhelm: Einen Befehl gibt es dafür nicht. Unter welchem Betriebssystem soll das denn passieren?
Willhelm
User
Beiträge: 26
Registriert: Montag 10. Februar 2014, 09:06

Es soll mit einem linux (Raspian) auf einem Raspbarry pi geschehen
Benutzeravatar
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
---------------------------------
have a lot of fun!
Willhelm
User
Beiträge: 26
Registriert: Montag 10. Februar 2014, 09:06

Vielen Dank
Ich bin relativ Neu in Python und behersche erst triviales.
mit welchen befehlen kann ich das verzeichniss auslesen und mit dem vorherigen vergleichen?
Benutzeravatar
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.
Willhelm
User
Beiträge: 26
Registriert: Montag 10. Februar 2014, 09:06

Ok vielen dank hat mir sehr geholfen.
Hat schon jemand erfahrung mit pyinotify gemacht??

noch kurz ne frage wie kann ich aus einem Python skript ein anderes python skript ausführen lassen, Geht dass?
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

Ja das ist möglich, wäre aber besser, wenn du den zweiten Script einfach importierst und die Funktionen nutzt.
Mit "subprocess.Popen()" sollte sowas machbar sein.
Benutzeravatar
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.
Willhelm
User
Beiträge: 26
Registriert: Montag 10. Februar 2014, 09:06

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.

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()
da währe ich sehr dankbar.
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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Willhelm hat geschrieben: ich habe es aus probiert aber es funktioniert nicht sieht jemand wo der fehler ist?
Ich habe einen Syntax-Fehler in Zeile 6 gefixt - lag es daran?
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
BlackJack

@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.
Willhelm
User
Beiträge: 26
Registriert: Montag 10. Februar 2014, 09:06

ok Danke

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()
es sagt in zeile 7 inconsistent use of tabs and spaces in indentation (hinter communicate() )
BlackJack

@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.
Willhelm
User
Beiträge: 26
Registriert: Montag 10. Februar 2014, 09:06

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.

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()
BlackJack

@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‽
Benutzeravatar
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:

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()
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.
Willhelm
User
Beiträge: 26
Registriert: Montag 10. Februar 2014, 09:06

Ja ich verstehen nicht viel von Python
und ich habe mich durch viele Anleitungen gekämpft und habe mir so ein skript zusammen gestellt.
danke cofi ich probiere es mal aus
Willhelm
User
Beiträge: 26
Registriert: Montag 10. Februar 2014, 09:06

mein hauptproblem zur zeit ist das es den fehler ausgibt no module named pyinotify obwohl ich es intalliert und im mit terminal python -m pyinotify aufrufen kann.
BlackJack

@Willhelm: Wir führst Du das Programm denn aus?
Antworten