Such no file or directory - Problem

  • Guten Tag,

    ich habe folgendes Problem benötige Hilfe aus dem Forum.

    Ich habe einen 1wire Temperatursensor angeschlossen und kann den Status ohne Probleme mit: cd /sys/bus/w1/devices/28-0000065fa6c1 und cat w1_slave
    anzeigen lassen. Ich sehe die Temperatur.

    Dann wollte ich die Daten in eine RRDatenbank schreiben, aber bevor dies geschehen kann soll über das Skript der Sensor abgefragt werden.
    Ich habe die entsprechende Stelle markiert:

    Bei pathes = ("/sys/bus/w1/devices/28-0000065fa6c1/w1_slave") gibt er mir bei der Ausführung des Skript folgendes zurück:

    Wie kann es sein, dass ich in dem Pfad mit cat den 1wire abfragen kann und im Skript die Fehlermeldung kommt der Pfad bzw. die Datei existiert nicht?

    Gruß

  • Hallo AliceDeh,

    Du willst ein Verzeichnis bzw. eine Datei innerhalb eines Verzeichnisses auslesen. Du erzeugst aber einen Dateinamen (möglicherweise soll dies sogar Pfad & Dateiname sein?), der nur aus einem einzigen Zeichen besteht. So zumindest versucht es Dir die zaghafte Fehlermeldung nahezubringen.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (17. Juli 2015 um 10:07)


  • Hallo AliceDeh,

    Du willst ein Verzeichnis bzw. eine Datei innerhalb eines Verzeichnisses auslesen. Du erzeugst aber einen Dateinamen (möglicherweise soll dies sogar Pfad & Dateiname sein?), der nur aus einem einzigen Zeichen besteht. So zumindest versucht es Dir die zaghafte Fehlermeldung nahezubringen.

    Beste Grüße

    Andreas

    Hi Andreas,

    also w1_slave ist die Datei zum auslesen, aber die Angabe ist doch eine Langezeichenkette und der Compiler erkennt diese Zeichenkette nicht als Gesamtes.
    Ich denke das Problem liegt hier:

    Code
    # read sensor data
    data = 'N'
    for path in pathes:
     data += ':'
     data += read_sensor(path)
     time.sleep(1)

    Der Code ist urpsrünglich für 2 Sensoren gedacht und hat auch funktioniert, aber wenn oben nur noch 1 Pfad eingetragen ist, meckert er.

    EDIT: Schon wieder hart am Überlegen, aber worin kann der Fehler liegen? Ein kleiner Denkanstoß? B-)

    Einmal editiert, zuletzt von AliceDeh (17. Juli 2015 um 10:23)

  • Sieht so aus als würde dir der Pfad in einzelne Zeichen zerlegt werden und dein Skript versucht nun jeden dieser Buchstaben als Pfad zu öffnen.

    in der for Schleife "for path in pathes:" rufst du read_sensor(path) für jede stelle in "pathes" auf... kann das sein?

    vll. muss nur das "data += read_sensor(path)" seperat stehen?

    Kann da nur Vermutunten anstellen, bin nicht so gut in Python, dass ich da ohne ausprobieren helfen kann ^^

  • Hallo AliceDeh,

    schau Dir doch mal die Fehlermeldungen an.

    Was Du für einen Pfad inkl. Dateinamen hältst, ist nur ein Zeichen lang.

    Hast Du in [font="Courier New"]pathes[/font] aber mehrere Sensoren-Pfade eingetragen, dann läuft es.

    :s

    ...

    :s

    ...

    :s

    Also musst Du die Länge der Liste [font="Courier New"]pathes[/font] prüfen... Ist hier nur ein Pfad enthalten, dann soll dieser direkt verwendet werde - ansonsten ist jeder Pfad aus [font="Courier New"]pathes[/font] zu entnehmen...

    Dann lässt Du Dir das Ergebnis mal ausgeben. Wenn hier immer ein sinnvoller Pfad herauskommt, dann wird' wohl auch in echt funktionieren.

    Ja, stimmt, die Schleife ist, [Zitat von Helge Schneider]. Das geht besser...

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (17. Juli 2015 um 10:35)

  • Hallo Bootsmann,


    ggf. zuerst mal ein Tutorial durcharbeiten.

    Bloß nicht! Probleme, die ohne Tutorial entstanden sind, müssen auch ohne Tutorial geklärt werden (können). ;)

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Habe ein Skript erstellt und nochmal die For-Schleife zu testen:

    Python
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    
    
    pathes = ("/sys/bus/w1/devices/28-0000065fa6c1/w1_slave")
    for path in pathes:
           print path

    Dabei bekam ich diese Ausgabe:

    Dabei ist mir ein Licht aufgegangen. Die Schleife war ja für 2 Sensoren die mit Komma getrennt wurden, also habe ich das Skript wiefolgt abgeändert, damit es mit nur einem 1wire Sensor läuft:


    Code
    # define pathes to 1-wire sensor data
    pathes = ("/sys/bus/w1/devices/28-0000065fa6c1/w1_slave")
    
    
    # read sensor data
    data = 'N'
    for path in pathes:
      data += ':'
      data += read_sensor(path)
      time.sleep(1)

    verändert in

    Code
    # define pathes to 1-wire sensor data
    path = ("/sys/bus/w1/devices/28-0000065fa6c1/w1_slave")
    
    
    # read sensor data
    data = 'N'
    data += ':'
    data += read_sensor(path)
    time.sleep(1)

    Ich danke für euer Hilfe!!!

    EDIT: Die For-Schleife raus und pathes geändert in path
    Komme mir gerade dumm vor :D

    Einmal editiert, zuletzt von AliceDeh (17. Juli 2015 um 10:44)

  • Hallo AliceDeh,

    hast Du den Beitrag #2 nicht gelesen oder nicht verstanden?


    Dabei ist mir ein Licht aufgegangen. Die Schleife war ja für 2 Sensoren die mit Komma getrennt wurden, also habe ich das Skript wiefolgt abgeändert, damit es mit nur einem 1wire Sensor läuft:
    Komme mir gerade dumm vor :D
    [/b]

    Hm, geht mir manchmal auch so... ich sitze stundenlang vor der Kiste. Ein Programm will nicht so, wie ich möchte. Mal fehlt ein Komma, ein Semikolon, ein do ein {...} oder ... oder ... oder.

    Das richtig Blöde dabei ist, dass man solche Fehler immer und wieder macht... programmer's fate?

    Ach, das Wichtigste dabei ist: Sich niemals entmutigen lassen!
    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (17. Juli 2015 um 10:54)

  • hast Du den Beitrag #2 nicht gelesen oder nicht verstanden?

    Hallo,
    um ehrlich zu sein, ich habe den Beitrag #2 auch nicht verstanden. So falsch war der Ansatz mit dem Tupel und der For-Schleife nämlich gar nicht. Nur hat das ganze bei nur einem Element im Tupel nicht so funktioniert wie es sollte. Mit einer Liste hätte es funktioniert. Also mit eckigen statt runden Klammern um den String für den Pfad.
    Gruß

  • Selbstverständlich funktioniert in Python die for-schleife auch über ein Element, das Problem sind hier aber verkürzende Schreibweisen.
    In modernen Sprachen wie Python und Ruby sind oftmals Schreibweisen erlaubt, sobald eindeutig ist, was damit gemeint ist, auch wenn eigentlich Typgebende Informationen fehlen. Wenn du die Liste von Pfaden mit der kompletten Listenschreibweise genutzt hättest, dann hätte der Computer den ersten Pfad als ersten Array-Eintrag erkannt.
    Es ist also eine Vereinfachung, die einem in diesem Fall um die Ohren fliegt :)

  • Und welche verkürzende Schreibweise hat den jetzt das Problem verursacht? Welche Vereinfachung ist denn da hochgegangen? Bitte mal Klartext!
    Mit einer Liste hätte das Ganze ja funktioniert, auch mit nur einem Element. Es wurde aber ein Tupel verwendet, dass ursprünglich mal 2 Elemente enthielt. Wenn das Tupel aber nur noch ein Element enthält, wird dieses Element in eine Sequenz zerlegt. Das ist ein bekanntes Verhalten, dass mit einem Komma hinter dem Element umgangen werden kann. Eine Liste zeigt dieses Verhalten nicht.


  • Selbstverständlich funktioniert in Python die for-schleife auch über ein Element, das Problem sind hier aber verkürzende Schreibweisen.
    In modernen Sprachen wie Python und Ruby sind oftmals Schreibweisen erlaubt, sobald eindeutig ist, was damit gemeint ist, auch wenn eigentlich Typgebende Informationen fehlen. Wenn du die Liste von Pfaden mit der kompletten Listenschreibweise genutzt hättest, dann hätte der Computer den ersten Pfad als ersten Array-Eintrag erkannt.
    Es ist also eine Vereinfachung, die einem in diesem Fall um die Ohren fliegt :)

    :s
    Versteh nur Bahnhof...
    Was ist eine "verkürzende Schreibweise" ?
    Was ist ein "Array-Eintrag" ?

    Das obige Problem war, dass er über den Datentyp "string" iteriert hat. Das Programm hat aber noch weit aus mehr zu bemängeln.

    rob.z
    Es wurde kein Tupel verwendet! Nur weil der String in Klammern steht, ist es noch lange klein Tupel...

  • Das obige Problem war, dass er über den Datentyp "string" iteriert hat. Das Programm hat aber noch weit aus mehr zu bemängeln.

    rob.z
    Es wurde kein Tupel verwendet! Nur weil der String in Klammern steht, ist es noch lange klein Tupel...

    Ok, wenn kein Tupel, was war es? Warum sollte man sonst einen String in Klammern an eine Variable übergeben?
    Ursprünglich wurden mit dem Script 2 Sensoren abgefragt, die durch ein Komma getrennt waren. Klingt für mich nach Tupel mit 2 Elementen. Wird ein (String-)Element mit trennendem Komma entfernt, weil nur ein Sensor abgefragt werden soll, wird das verbleibene (String-)Element zur Sequenz und es wird über den String iteriert.


  • Ok, wenn kein Tupel, was war es? Warum sollte man sonst einen String in Klammern an eine Variable übergeben?

    Du kannst den Typ der Variable dir ausgeben lassen und dann sieht du, um was für einen Datentyp es sich handelt.
    Das mit dem Datentyp ``tuple`` hast du schon richtig erklärt, nur handelt es sich beim obigen Beispiel nicht um ein tuple sondern um einen string...


  • Und welche verkürzende Schreibweise hat den jetzt das Problem verursacht? Welche Vereinfachung ist denn da hochgegangen? Bitte mal Klartext!
    Mit einer Liste hätte das Ganze ja funktioniert, auch mit nur einem Element. Es wurde aber ein Tupel verwendet, dass ursprünglich mal 2 Elemente enthielt. Wenn das Tupel aber nur noch ein Element enthält, wird dieses Element in eine Sequenz zerlegt. Das ist ein bekanntes Verhalten, dass mit einem Komma hinter dem Element umgangen werden kann. Eine Liste zeigt dieses Verhalten nicht.

    Den Trick mit dem Komma muss ich mir merken :danke_ATDE:

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!