rrdtool in Python3 (nicht im Terminal / "bash")

  • Hallo Forum,

    bitte helft mir beim Syntax von rrdtool, angewendet in Python3, der Editor ist Thonny.

    Die gefundenen Erklärungen zu rrd beziehen sich auf die „batch“, nicht aber in Verwendung in einem Editor.

    Beispiel: ret = rrdtool.graph("%s%s_%s-%s.png" %(path,dbname,a,plot),

    oder

    "DEF:%s=%s:%s_%s:AVERAGE" %(a, filename, dbname, a),

    "LINE1:%s#0000FF:%s_%s" %(a, dbname, a))

    Was bewirkt „%s“ oder „%s_“ genau in dem Script. Es hat was mit der Formatierung zu tun – aber warum / wieso der Aufwand und welcher Regel gilt hier?
    Gibt es auch eine deutsch Erklärung zu rrdtool ?
    Grüße

  • Zur hilfreichsten Antwort springen
  • AndreasO Welcher Aufwand?

    Das hat nichts mit `rrdtool` zu tun. Das ist Python. Und würde heute wohl auch nicht mehr ohne einen guten Grund so verwendet, denn der ``%``-Operator auf Zeichenketten ist durch die `format()`-Methode und f-Zeichenkettenliterale abgelöst. Die Beispiele sähen also so aus:

    Python
        return_code = rrdtool.graph(f"{path}{dbname}_{a}-{plot}.png", ...)
    
        f"DEF:{a}={filename}:{dbname}_{a}:AVERAGE"
    
        f"LINE1:{a}#0000FF:{dbname}_{a}"

    `a` ist kein guter Name. Der sagt dem Leser überhaupt nichts über die Bedeutung dieses Wertes.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Hallo __blackjack__
    so etwas hatte ich vermutet. Das Script war im Original für Python2 geschrieben.
    Zuerst versuche ich den Befehl für rrdtool in "Klarschrift" zum laufen zu bringen, danach werde ich die neue Formatierung anwenden.
    Die benötigten Befehlsfolge (syntax) für rrdtools ist mir trotz der Doku unter https://oss.oetiker.ch/rrdtool/doc/index.en.html (für mich) nur schwer zu durchschauen.
    Hilfe für das anwenden von rrdtools wird gerne angenommen.

  • Das hängt mir alles zu hoch!

    Ohne fundierte Kenntnisse von Syntax gebe ich mir noch die Kugel.

    Die Original-Erklärung / Doku bezieht sich offenbar auf die batch, ich (versuche) aber ein Scrip in Thonny-Python zu schreiben. Wegen der Syntax-Abweichungen kann das nichts werden.

    >>>> Wo gibt es bitte eine deutsche Erklärung für rrdtool mit Python ????

    PS: rrdtool war in der batch erst nach einer weiteren Installation verfügbar. In Thonny kann es mit Import genutzt werden, in Geany ist rrdtool aber nicht verfügbar. Das verstehe ich nicht!

    Bitte um Hilfe !

  • hier mein Script. Im Moment wird das Script nur zu testzwecken verwendet, um rrdtool zu verstehen. Im Ursprung kommt das Teil von rrd von https://www.leben-zwo-punkt-null.de/pi-trifft-die-graphen/

    Dein Link schaue ich gleich morgen früh an.
    Grüße

  • Hallo,

    wolltest du den Code so ausführen lassen? Es fehlen einige Einrückungen, die sind in Python sehr wichtig, sonst wird dein Code falsch übersetzt.

    Du solltest deinen Shebang (erste Zeile) auf Python3 anpassen. Python2 wird seit über einem Jahr nicht mehr durch die Entwickler unterstützt.

    Du hast im Code ja schon Methoden wie sie in Python3 verwendet werden (z.B. print()), aber auch wieder Strings die du mit '+' zusammensetzt. Da nimmt man f-Strings oder 'format'-Methode.

    Importiert werden alle Module am Programmanfang. Dann solltest du dir auch für Testzwecke angewöhnen deinen Code in Funktionen zu unterteilen. Das sind ja jetzt nicht nur 5 Zeilen Test-Code.

    Ich will dir nicht zu nahe treten, aber vielleicht solltest du erst mal eine Funktion nach der anderen zum laufen bekommen und dann deinen Code Stück für Stück erweitern. Ich bin selbst kein in den Anfängen, aber das sieht schon sehr chaotisch aus.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Hallo Forum,
    kommen wir nochmal zum Anfang der Fragestellung: rrdtool

    Der Befehl:

    Python
    print("('{filename_rrd}', 'N:{z}');".format(**locals()))

    gibt das Ergebnis:

    ('fstb.rrd', 'N:1');

    Das Ergebnis genommen und direkt an den Befehl gesetzt:

    Python
    rrdtool.update ('fstb.rrd', 'N:1'); 

    funktioniert ohne Fehlermeldung. Das selbe aber mit dem Format-String ergibt:

    Python
    rrdtool.update "('{filename_rrd}', 'N:{z}');".format(**locals())
                                                ^
    SyntaxError: inviald syntax

    Er beschwert sich an / über das "-Zeichen

    Welche Logik ist ber Implementierung von Befehlen anzuwenden, wenn diese in Thonny-Python3 verwendet werden ?????????
    Wo ist die Logik :conf:

  • Hallo,

    Er beschwert sich an / über das "-Zeichen

    Nur als Hinweise, der Pfeil zeigt die Stelle, an der dem Interpreter aufgefallen ist, das etwas nicht stimmt. Es kann durchaus vorkommen, dass der Fehler etwas weiter "vorne" zu suchen ist.

    Wie hyle schon sagt, ist 'update' eine Funktion. Die Argumente die eine Funktion braucht übergibt man ihr in einem Klammerausdruck. Das heißt hinter 'update' kommt eine sich öffnende Klammer und keine Anführungszeichen. Ich würde es wie hyle schreibt versuchen oder so:

    Code
    rrdtool.update(('{filename_rrd}', 'N:{z}');".format(**locals()))

    Da 'update' ,laut Doku, eine Tupel erwartet und wenn ich mich mit den Klammern nicht verguckt habe, könnte es so hinkommen.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

    • Offizieller Beitrag

    Ich würde es wie hyle schreibt versuchen oder so

    Ich hatte einfach nur, faul wie ich bin, den print()-Befehl aus #9 kopiert.

    Btw. Die Klammern sollten passen, aber ist noch ein ". ;) Und bei dem ; bin ich mir gerade auch nicht sicher, ob dat mut oder ggf. sogar eher stört.

    • Hilfreichste Antwort

    AndreasO Du versuchst da eine Zeichenkette zu erstellen die einen Teil der Python-Syntax in einer Zeichenkette enthält. Das geht so nicht. Python interpretiert da nicht irgendwelche Zeichenketten die zur Laufzeit erstellt werden nachträglich als Python-Code, den der Compiler ja nie gesehen hat. Was der sieht ist ein Python-Ausdruck und getrennt durch ein Leerzeichen ein weiterer Python-Ausdruck. Und das macht keinen Sinn und führt dementsprechend zu einem Syntaxfehler den der Compiler meldet bevor dieser Code überhaupt ausgeführt wird. Wenn der Compiler damit nicht klar kommt, kann es ja auch gar nichts zum ausführen geben.

    Die Python-Anbindung an `rrdtool` ist soweit ich das sehe extrem simpel gestrickt und man gibt einfach nur die Argumente die man auf der Kommandozeile angeben würde auf einzelne Argumente aufgeteilt bei den Funktionsaufrufen an.

    Achtung: Das `args` laut Dokumentation ein Tupel ist, bedeutet nicht das die Funktion ein Tupel als Argument haben will, denn die Signatur ist `update(*args)` und nicht `update(args)`.

    Ein Beispiel ist in der Dokumentation doch auch zu sehen. Gleich ganz am Anfang steht:

    Also kein Tupel, keine Zeichenekette mit Klammern und kein Semikolon.

    Im vorliegenden Programm ist der Dateiname (sehr wahrscheinlich) bereits eine Zeichenkette und muss nicht noch sinnloserweise noch mal in eine Zeichenkette formatiert werden die wieder nur die gleiche Zeichenkette als Ergebnis hat. Da muss also nur der Wert von `z` entsprechend formatiert werden:

    Code
    ...
    
    def main():
        ...
        rrdtool.update(filename_rrd, f"N:{z}")

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

Jetzt mitmachen!

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