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.
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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@BlackJack: Ich habe in Zeile 6 lediglich das letzte String-Literal korrekt beendet, sprich ein einzelnes ' hinter dem "'changed" hinzugefügt. Das sah ich sofort durch das Syntax-Highlighting; alles andere hab ich mir nicht weiter angeguckt.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Willhelm
User
Beiträge: 26
Registriert: Montag 10. Februar 2014, 09:06

Angefangen mit IDLE 3 wenn ich eingebe import pyinotify kommt No module named pyinotify

oder wenn ich ein in einem blank file schriebe die datei endung auf .py mache und in den einstellungen make the file executable. und dann f5 oder im reiter run auf run module klicke kommt der fehler.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dann hast Du das Modul offenbar nicht oder nicht korrekt installiert ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Willhelm: Wenn Du ein Modul für Python 2 installierst, dann steht das natürlich nicht in Python 3 zur Verfügung. Wenn Du es mit Python 2 mit ``python -m pyinotify`` ausführst, dann geht es.
Willhelm
User
Beiträge: 26
Registriert: Montag 10. Februar 2014, 09:06

ich habe die pyinotify version 0.9.4 die eigentlich auch für python 3 gedacht ist.
installiert habe ich es mit sudo pip install pyinotify und update habe ich auch schon ausgeführt
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ich nehme mal an, dass das das "Standard" pip ist. Dann benutzt das das `python` Executable, was zur Zeit "normalerweise" fuer Python 2 steht.

Code: Alles auswählen

python3 -m pip install pyinotify
sollte es dir fuer Python 3 installieren.
Willhelm
User
Beiträge: 26
Registriert: Montag 10. Februar 2014, 09:06

geht nicht zurück kommt no module named pip
BlackJack

@Willhelm: Na dann ist `pip` nicht für Python 3 installiert sondern nur für Python 2.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Auf Linux-Systemen, bei denen Python2 Standard ist, wird ein ``pip`` für Python3 dann unter dem Namen ``pip3`` abgelegt (also der Aufrufname im Pfad). Vermutlich musst Du erst über die Paketverwaltung Deiner Distribution das entsprechende Paket (iirc auch oftmals ``pip3``) installieren *und* dann entsprechend aufrufen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Willhelm
User
Beiträge: 26
Registriert: Montag 10. Februar 2014, 09:06

ok vielen Dank ich habe noch einbischen rum probiert aber es hat nicht funktioniert. desshalb habe ich es sein lassen.
Ich bin ausgewichen auf wenn ein file ausgelesen wird mach das.



So sieht es aus und es funktioniert :)

Code: Alles auswählen

import pifacedigitalio as p
import time
p.init()

a = 50

while a > 5:

 a = 6
 f = open('/home/pi/Befehl.txt', 'a')
 text = f.read(4)
 f.close()
 
 if text == 'Ein1':
   print ('Ein1')
   p.digital_write(0,1)

 if text == 'Aus1':
   print ('Aus1')
   p.digital_write(0,0)
   
 if text == 'Ein2':
   print ('Ein2')
   p.digital_write(1,1)
   
 if text == 'Aus2':
   print ('Aus2')
   p.digital_write(1,0)

 if text == 'Ein3':
   print ('Ein3')
   p.digital_write(0,1)
   p.digital_write(1,1)
   
 if text == 'Aus3':
   print ('Aus3')
   p.digital_write(0,0)
   p.digital_write(1,0)



 time.sleep(1)
Jetzt möchte ich aber wieder in das file zurück schreiben und habe viel gegoogelt aber nichts hat funktioniert.
da die typen andere befehle nutzen.

freue mich auf eine Antwort
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Naja, nutze einfach die Methoden zum Schreiben auf einem File-Objekt, etwa ``fobj.write`` :K

Dateien solltest Du immer so öffnen:

Code: Alles auswählen

with open(...) as file_handle:
    # in diesem Block ist file_handle Dein geöffnetes File-Objekt
    # es wird *automatisch* und *auch im Fehlerfall* geschlossen
Diese ganzen ``if``-Blöcke kann man durch ein Dictionary ersetzen:

Code: Alles auswählen

dispatching = {
    "Ein1": ((0, 1), ),
    "Aus1": ((0, 0), ),
    ...
    "Ein3": ((0, 1), (1,1)),
    ...
}

for text, data in dispatching.items():
    print(text)
    for pair in data:
        p.digital_write(*pair)
ungetestet!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Du kopierst noch sehr viel Code, "p" ist für ein Modulname doch sehr nichtssagend, dieses komische "a" mit seinen magischen Werten ist sehr magisch. Einrücktiefe ist immer vier Leerzeichen! Auf Modulebene sollte außer Definitionen nichts stehen.
Ich komm auf ungefähr das hier:

Code: Alles auswählen

import pifacedigitalio as digitalio
import time

def main():
    digitalio.init()
    while True:
        with open('/home/pi/Befehl.txt', 'a') as f:
            text = f.read(4)
            f.write('Okay')
        print(text)
        ein = text.startswith('Ein')
        bits = int(text[3:])
        for port in (0,1):
            if bits&(1<<port):
                digitalio.digital_write(port, ein)
        time.sleep(1)
        
if __name__ == '__main__':
    main()
Willhelm
User
Beiträge: 26
Registriert: Montag 10. Februar 2014, 09:06

Ok tut mir leid ich habe noch die falsch libary importiert

Code: Alles auswählen

import pifacedigitalio
import time
pfd = pifacedigitalio.PiFaceDigital()

a = 50

while a > 5:

    a = 6
    f = open('/home/pi/Befehl.txt', 'r')
    text = f.read(4)
    f.close()
 
 if text == 'Ein1':
    print ('Ein1')
    pfd.relays[0].value = 1

 if text == 'Aus1':
    print ('Aus1')
    pfd.relays[0].value = 0
   
 if text == 'Ein2':
    print ('Ein2')
    pfd.relays[1].value = 1
   
 if text == 'Aus2':
    print ('Aus2')
    pfd.relays[1].value = 1

 if text == 'Ein3':
    print ('Ein3')
    pfd.relays[0].value = 1
    pfd.relays[1].value = 1
   
 if text == 'Aus3':
    print ('Aus3')
    pfd.relays[0].value = 0
    pfd.relays[1].value = 0


   
 time.sleep(1)
Antworten