Seite 1 von 2

Auslösen wenn file in Ordner abgelegt wird

Verfasst: Montag 10. Februar 2014, 09:17
von Willhelm
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

Re: Auslösen wenn file in Ordner abgelegt wird

Verfasst: Montag 10. Februar 2014, 10:02
von BlackJack
@Willhelm: Einen Befehl gibt es dafür nicht. Unter welchem Betriebssystem soll das denn passieren?

Re: Auslösen wenn file in Ordner abgelegt wird

Verfasst: Montag 10. Februar 2014, 10:27
von Willhelm
Es soll mit einem linux (Raspian) auf einem Raspbarry pi geschehen

Re: Auslösen wenn file in Ordner abgelegt wird

Verfasst: Montag 10. Februar 2014, 10:45
von Käptn Haddock
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

Re: Auslösen wenn file in Ordner abgelegt wird

Verfasst: Montag 10. Februar 2014, 10:57
von Willhelm
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?

Re: Auslösen wenn file in Ordner abgelegt wird

Verfasst: Montag 10. Februar 2014, 11:01
von cofi
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.

Re: Auslösen wenn file in Ordner abgelegt wird

Verfasst: Montag 10. Februar 2014, 15:19
von Willhelm
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?

Re: Auslösen wenn file in Ordner abgelegt wird

Verfasst: Montag 10. Februar 2014, 23:13
von Dami123
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.

Re: Auslösen wenn file in Ordner abgelegt wird

Verfasst: Dienstag 11. Februar 2014, 00:10
von cofi
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.

Re: Auslösen wenn file in Ordner abgelegt wird

Verfasst: Dienstag 11. Februar 2014, 09:07
von Willhelm
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

Re: Auslösen wenn file in Ordner abgelegt wird

Verfasst: Dienstag 11. Februar 2014, 09:47
von Hyperion
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.

Re: Auslösen wenn file in Ordner abgelegt wird

Verfasst: Dienstag 11. Februar 2014, 09:50
von 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.

Re: Auslösen wenn file in Ordner abgelegt wird

Verfasst: Dienstag 11. Februar 2014, 09:57
von Willhelm
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() )

Re: Auslösen wenn file in Ordner abgelegt wird

Verfasst: Dienstag 11. Februar 2014, 10:03
von 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.

Re: Auslösen wenn file in Ordner abgelegt wird

Verfasst: Dienstag 11. Februar 2014, 10:21
von Willhelm
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()

Re: Auslösen wenn file in Ordner abgelegt wird

Verfasst: Dienstag 11. Februar 2014, 11:05
von 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‽

Re: Auslösen wenn file in Ordner abgelegt wird

Verfasst: Dienstag 11. Februar 2014, 11:08
von cofi
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.

Re: Auslösen wenn file in Ordner abgelegt wird

Verfasst: Dienstag 11. Februar 2014, 11:18
von Willhelm
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

Re: Auslösen wenn file in Ordner abgelegt wird

Verfasst: Dienstag 11. Februar 2014, 11:27
von Willhelm
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.

Re: Auslösen wenn file in Ordner abgelegt wird

Verfasst: Dienstag 11. Februar 2014, 12:56
von BlackJack
@Willhelm: Wir führst Du das Programm denn aus?