ein (Klassen-)Funktion alle x Sekunden/Minuten ausführen

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.
Antworten
der_Angler
User
Beiträge: 25
Registriert: Montag 28. Januar 2013, 00:48

Was ein Ton hier :(
Das soll jetzt wirklich nicht falsch rüber kommen, aber anscheinend habe ich hier die absoluten Python-Götter vor mir.
Irgendwie ist alles, aber wirklich alles was ich woanders im Netz finde eurer Meinung nach Quatsch und falsch. :(
Ich finde das sehr schade, so vertreibt man Anfänger.
Oder wo greifst Du auf `cls_Raspi_Temp.temp_cpu` zu?
Entweder reden wir komplett aneinander vorbei oder du hast den Code nicht gelesen?
Hier greife ich darauf zu:

Code: Alles auswählen

            if line == 'get cpu':
                ausgabe=(str(Raspi_temperatures.temp_cpu)+" °C\n")
                self.send(ausgabe)
Die sind ja auch immer 0
Sicher nicht, mit

Code: Alles auswählen

            with open('/sys/class/thermal/thermal_zone0/temp', 'r') as tmpFile:
                self.temperature_cpu = float(tmpFile.read())/1000
            tmpFile.closed
            self.temperature_gpu = float(subprocess.check_output(["/opt/vc/bin/vcgencmd", "measure_temp"]).replace( 'temp=', '' ).replace( '\'C', '' ).rstrip())
werden beide Variablen gesetzt.
Die ``if``\s werden trotzdem ausgeführt, also die Bedingungen werden überprüft, auch wenn dem Programmierer/Leser eigentlich klar ist, dass wenn eine Bedingung zutrifft die anderen nicht zutreffen können und man sie deswegen nicht testen braucht → ``elif``.
Was dann jetzt? In meinem ersten Code-Beispiel, ganz oben (an den Anfang scrollen) hatte ich noch "elif" genutzt und dort wurde dann auch gemeckert ... wie ich es mache, es ist falsch.
Was ist daran jetzt besser oder übersichtlicher als eine Funktion aufzurufen, die diese beiden Werte als Rückgabewert hat?
Das ich dann jedes mal einen Diskzugriff hätte, der sicher länger dauert als nur schnell die Variabel auszulesen.
Und auf einem Raspberry Pi versuche ich Zeit zu sparen wo es geht.
Allerhöchstens irgendwo ganz oben in der Aufrufhierarchie wenn man man das Programm zum Beispiel in einer Hauptschleife unbedingt davon abhalten möchte abzubrechen. Dann sollte man aber den Fehler irgendwie protokollieren, damit die nicht einfach so verschluckt werden und man sie auch finden kann. `logging` kennt dafür die `exception()`-Funktion/-Methode, die auch gleich den gesamten Traceback protokolliert. Denn von einer Warnung die einfach nur 'Unerwarteter Fehler' hat man nicht wirklich etwas wenn man den Fehler suchen und beseitigen möchte.
Danke, das hilft mir wirklich weiter.
Damit werde ich mich gleich befassen :D
Stringformatierung benutzt immer noch nicht
Wo gebe ich den Strings noch mit "+str()" aus?
Was ist den an dieser Lösung falsch, bzw. nicht formatiert?

Code: Alles auswählen

logger.info('Raspberry Pi - GPU Temperatur %s °C', self.temperature_gpu)
warum benutzt du with und closed, was soll das überhaupt sein?
Hier könnte ich wieder heulen. Erst wird gemeckert das ich mit "open as" arbeiten soll.
Vermutlich der gleiche Grund warum man kein with open as verwendet
Dann suche ich im Internet nach einem entsprechend Tutorial und baue es ein - wieder falsch. :?


Sry Leute, da steige ich nicht mehr durch, mal so, mal so, rüder Ton (m.M.) und nur wenig wirkliche Hilfe.

Schade, echt schade, den ich hatte wirklich gehofft hier geholfen zu bekommen. :cry:
Und nein, ich wollte kein fertiges Skript geliefert bekommen sondern nur 2-3 Zeilen Code als Hinweis wie es besser/richtig ist.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

der_Angler hat geschrieben:Was ein Ton hier :(
Das soll jetzt wirklich nicht falsch rüber kommen, aber anscheinend habe ich hier die absoluten Python-Götter vor mir.
Ja, da hast du recht, da ist der Ton tatsächlich etwas härter ausgefallen als nötig ist.
der_Angler hat geschrieben:Irgendwie ist alles, aber wirklich alles was ich woanders im Netz finde eurer Meinung nach Quatsch und falsch. :(
Es ist tatsächlich so dass im Rasberry Pi-Umfeld unglaublich schlechter Code zu sehen ist. Das macht mir fast schon Angst, weil die Leute dann kompletten Stuss zusammenschreiben (weil es geht ja) und dass es dann furchtbar zum warten oder nachvollziehen ist, ist dann egal. Noch stolz nen Blogpost oder ein Tutorial mit dem schlechten Code schreiben und passt :|
der_Angler hat geschrieben:
Oder wo greifst Du auf `cls_Raspi_Temp.temp_cpu` zu?
Entweder reden wir komplett aneinander vorbei oder du hast den Code nicht gelesen?
Ich glaube ersteres: Klassenattribute und Instanzattribute sind unterschiedliche Sachen. Das was du in Zeile 15 und 16 definierst sind Klassenattribute. Das was du in Zeile 24 setzt sind Instanzattribute.
der_Angler hat geschrieben:
Stringformatierung benutzt immer noch nicht
Wo gebe ich den Strings noch mit "+str()" aus?
Zeile 64, Zeile 67 sind mir jetzt beim durchschauen aufgefallen. Du solltest deinen eigenen Code tatsächlich etwas sorgfältiger lesen.
der_Angler hat geschrieben:
warum benutzt du with und closed, was soll das überhaupt sein?
Hier könnte ich wieder heulen. Erst wird gemeckert das ich mit "open as" arbeiten soll.
Man soll natürlich das ``with``-Statement nutzen, aber dann ist die Zeile 25 komplett überflüssig. Und auch sonst sinnlos, weil das ist ja nur der Name eines Objektes, damit wird nichts gemacht, also ist diese Zeile so wie sie da steht unsinnig.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@der_Angler: Bei einer Funktion hätte man genau die gleichen Diskzugriffe wie bei der Klasse. Man müsste sich nur die Ergebnisse an passenderer Stelle merken.

Ergänzend zu Leonidas: Du machst da ja fröhlich mit indem Du Sachen irgendwo abschreibst die Du nicht vollständig verstehst, und damit weder beurteilen kannst ob das tatsächlich funktioniert, noch wie sinnvoll der Code insgesamt ist. Was hier passiert ist das selbe weshalb so viel verdammt schlechter PHP-Quelltext da draussen zu finden ist — Leute die keine Ahnung haben schreiben von Leuten die keine Ahnung haben ab, immer nach der Devise „Hauptsache es funktioniert”, zumindest oberflächlich betrachtet.

Gibt es zum Beispiel eine Begründung für die verhältnismässig aufwändige und low-level `asyncore`/`epoll`-Lösung, ausser dass Du die irgendwo so fertig gefunden hast?

Edit: Im `Client` fiel mir gerade ein Fehler auf: Wenn beim `pollster`-Argument nichts übergeben wurde, dann wird auch das gleichnamige Attribut nicht gesetzt. Das wird dann in den Methoden die versuchen drauf zuzugreifen zu einem Fehler führen.
Antworten