Python Logging

  • Hi,

    ich bin grade etwas am verzweifeln. Und zwar habe ich mir ein kleines Skript geschrieben, dass den Lüfter steuern soll. Nun möchte ich zusätzlich zur Lüfterstufe auch den Wert der Variable temp mit ins log file übergeben und scheitere daran etwas. Ich hoffe mir kann jemand behilflich sein, um den richtigen Lösungsansatz zu finden.

    Als output erhalte ich für temp leider immer nur das:

    Code
    2019-11-24 17:50:07,285:    Stufe: Boot    Temperatur: <function temp at 0xb67bc7f0>
  • Hallo iGodPhil!

    was passiert, wenn Du das Skript mit Python3 ausführst?


    Btw. Ich würde Dir gpiozero empfehlen, das ist einfacher und schöner als das olle RPi.GPIO. Außerdem bringt es gleich noch CPUTemperature mit. ;)

    Hier mal auf die Schnelle ein kleines Skript, das alle 2 Sekunden die Temperatur der CPU anzeigt:

  • Hmm dein Skript bringt mich leider an meiner Stelle nicht weiter. Über die normale print Funktion hab ich es auch hinbekommen die Temperatur auszugeben. Mein Skript wird aber über ein Crontab ausgeführt und soll den Wert in eine Log Datei schreiben und ich würde gerne verstehen wieso mein Skript nicht funktioniert um daraus zu lernen. Danke trotzdem.

  • format() mit Python2?

    Versuchst doch einfach mal, vielleicht hast Du Glück und mit das die Module auch für Python3 installiert sind! Du brauchst ja nur eine 3 an das python im Shebang (oder im CLI) anhängen.

    Ursprünglich wollte ich das in Python 3 schreiben aber da hat er wegen dem commands rumgemeckert. Naja war dann doch leichter zu ersetzen als gedacht aber leider übergibt er den Wert auch in Python 3 so merkwürdig.


    Beschäftige Dich mal mit dem "scope" von Variablen in Python und überleg Dir dann noch mal, was die Variable "temp" zum Zeitpunkt Deines logging-Aufrufs enthält.

    Werd ich später mal machen und mich dann nochmal melden.

  • Hallo,

    Quote
    logging.info("Stufe: Boot Temperatur: {}".format(temp))

    Schau dir mal an, was `temp` in dieser Zeile ist - es ist der Name einer Funktion. Wenn du nur den Namen der Funktion eingibst, bekommst du eine Referenz auf die Funktion. Und genau das landet in deiner Logging-Datei. Wenn du den Rückgabewert der Funktion haben willst, musst du die Funktion auch aufrufen.

    Gruß, noisefloor

  • Hallo,

    Schau dir mal an, was `temp` in dieser Zeile ist - es ist der Name einer Funktion. Wenn du nur den Namen der Funktion eingibst, bekommst du eine Referenz auf die Funktion. Und genau das landet in deiner Logging-Datei. Wenn du den Rückgabewert der Funktion haben willst, musst du die Funktion auch aufrufen.

    Gruß, noisefloor

    Ja Danke. Der Tipp von Manul hat schon geholfen. Meine Variable war quasi in der Def von Funktion Temp nur lokal aufrufbar und wurde am Ende nicht mehr global aufgerufen. Mein fertiges Skript sieht jetzt wie folgt aus:

    Problem gelöst. Danke.

  • Hallo,

    Quote

    Problem gelöst. Danke.

    Ich sag's mal so: das ist keine Lösung, das ist lauffähiger aber schrottiger Code. Will man so nicht. Generell will man `global` in 99,9% der Fälle - inkl. diesem - _nicht_ verwenden. Tipp: beschäftige dich nochmal dringend mit Funktionen, Rückgabewerten und wie man diese verwendet.

    Richtig macht man das so:

    Quote
    logging.info("Stufe: Boot Temperatur: {}".format(temp()))

    Sinnig ist auch, wenn man der Funktionen eine _aussagekräftigen_ Namen geben würde wie `get_temperature`. Dann wäre vielleicht auch nicht die Verwirrung mit dem `temp` Variablenname im lokalen Scope der Funktion entstanden.

    Gruß, noisefloor

  • Vielen Dank erstmal für die ganzen Tipps. Ich werd mich sicherlich in einer freien Minute damit nochmal beschäftigten.

    Mir ist aber noch nicht ganz klar wieso bei der logging Ausgabe das Ziel ist, ohne str(temp) hinzukommen?

    Quote

    logging.info("Stufe: Boot Temperatur: {}".format(temp()))

    Wenn ich das so schreibe wird das Skript gar nicht erst ausgeführt, da ein str erwartet wird.

  • Ein kurzes Update des Skripts.

    wenn ich das jetzt alles richtig verstanden habe :

    get_temp - Funktion die ausgeführt wird

    temp - die lokale Variable der Funktion get_temp

    return Befehl - nötig um den Wert der lokalen Variable temp nach außen ausgeben zu können

    temp_ausgabe - gloable Variable die der Wert der Funktion get_temp zugeordnet wird, da global kann sie im log aufgerufen werden

    ?

  • Hallo,

    Quote

    wenn ich das jetzt alles richtig verstanden habe :

    so 50:50 ;)

    Quote

    wenn ich das jetzt alles richtig verstanden habe :

    get_temp - Funktion die ausgeführt wird

    Nein. `get_temp` ist der Name der Funktion, `get_temp()` ruft die Funktion auf.

    Quote

    return Befehl - nötig um den Wert der lokalen Variable temp nach außen ausgeben zu können

    Ja. Wobei du, damit die Variable auch nutzbar ist, diese an eine neue Variable binden musst. Der Aufruf `get_temp()` würde die Variable "ins nichts" befördern, der Aufruf `foo = get_temp()` den per an `return` zurück gelieferten Wert an `foo` binden.

    Quote

    temp_ausgabe - gloable Variable die der Wert der Funktion get_temp zugeordnet wird, da global kann sie im log aufgerufen werden

    Nicht global, sondern auf oberster Ebene des Programms.

    Tipp: les' dir im offiziellen Python-Tutorial nochmals die Kapitel zu Funktionen, `return` und dem Scope von Variablen durch. Das brauchst du immer, wenn du in Python programmierst.

    Gruß, noisefloor

  • Quote

    Nein. `get_temp` ist der Name der Funktion, `get_temp()` ruft die Funktion auf.

    Naja so meinte ich das eigentlich auch. Dann hab ich mich einfach nur falsch ausgedrückt.

    Quote

    Tipp: les' dir im offiziellen Python-Tutorial nochmals die Kapitel zu Funktionen, `return` und dem Scope von Variablen durch. Das brauchst du immer, wenn du in Python programmierst.

    In den nächsten Semesterferien werde ich sicherlich dazu mal kommen. Aktuell fehlt einfach die Zeit dafür, aber danke dir für den Hinweis.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!