Posts by __blackjack__

    framp Für die Shell schreibt man sich dann einfach ein kleines C-Programm wenn man keines findet wo die Autoren sich Gedanken darüber gemacht haben, dass man die Ausgabe auch maschinell sicher verarbeiten kann. Es gibt ja vereinzelt Programme die von Haus aus, oder per Option, Ausgaben liefern die CSV-ähnlich sind, oder gar JSON, XML, oder irgend ein anderes standardisiertes, strukturiertes Format.

    So Frickellösungen kann man umgehen, in dem man die dafür vorgesehen Schnittstellen verwendet, statt externe Programme aufzurufen und deren Ausgabe zu parsen, auch wenn die dafür gar nicht vorgesehen sind. Im Falle von Interface-Name zu IPv4-Adresse wären das unter Linux die Funktionen `getifaddrs()`/`freeifaddrs()` und `getnameinfo()` aus der C-Bibliothek. Man muss dann schauen wie man das in die gewünschte Programmiersprache bekommt. Viele bieten eine „foreign functions interface“-API um C-Funktionen in Bibliotheken zur Laufzeit anzusprechen falls es nicht einfacher ist so etwas beim Compilieren in das eigene Programm zu ziehen.


    In Python könnte man sich beispielsweise wie folgt eine Funktion schreiben die Paare von Interfacname und IPv4-Adresse liefert:

    Icon bietet wohl auch eine Möglichkeit dynamisch eine C-Funktion aus einer Bibliothek zu laden, aber da müssen die C-Funktionen bestimmten Anforderungen genügen, so dass man nicht einfach irgendwelche C-Funktionen aufrufen kann. Da müsste man sich also eine kleine C-Bibliothek mit der Funktionalität schreiben, die man dann einbinden kann.

    Naja Yacc/Lexx sind ja kein Icon. Und an der Stelle wundere ich mich warum der Icon-Fan hier externe Werkzeuge einsetzt anstelle des von SNOBOL inspirierten ziemlich mächtigen „string scanning“/„pattern matching“ in Icon zu verwenden‽

    resses_jack Bücher? Also naja, man kann sich die Python-Dokumentation auch als PDF runterladen, ausdrucken, und als Buch binden… 🙂


    Also beenden kannst Du das Programm auch ohne Änderungen mit Strg+C.


    Falls Du dabei den Traceback von der `KeyboardInterrupt`-Ausnahme nicht haben möchtest, müsstest Du diese Ausnahme behandeln. Also am besten den ganzen Code in der `main()`-Funktion in einen ``try``-Block setzen und dann mit ``except`` die `KeyboardInterrupt`-Ausnahme behandeln und das mit einem ``pass`` falls da sonst nichts weiter passieren soll.

    resses_jack Kontextmanager sind Objekte die man mit ``with`` verwenden kann wo das Objekt bestimmt was am Anfang und am Ende von so einem ``with``-Block passiert, und zwar egal aus welchen Gründen der Programmfluss diesen Block verlässt. Also egal ob der einfach unten aus dem Block ”raus läuft”, oder der Block durch ``return``, ``break``, ``continue``, oder einer Ausnahme verlassen wird. Das Kamera-Objekt wird dann ”geschlossen” und die belegten Ressourcen wieder freigegeben.


    Und, ich weiss das kommt jetzt sicher völlig überraschend, ``with`` ist tatsächlich in der Python-Dokumentation dokumentiert. Wie alle anderen Python-Schlüsselworte auch. Die haben echt keins vergessen. Absolut unglaublich. 😎

    resses_jack Ergänzend zur Frage von Dennis89: Falls die Zeilen ausgeführt würden, stellt sich die gleiche Frage bei den drei Zeilen dann auch noch mal bei der letzten Zeile. Und natürlich auch noch wie denn über die erste Zeile hinausgekommen werden soll wo versucht wird `GPIO` zu verwenden was nirgends definiert ist.


    Das Programm Endet am Ende automatisch, da muss man kein `sys.exit()` hinschreiben. (`sys` wurde auch nicht importiert.)


    Und auch `cam` existiert nicht, sollte man tatsächlich bis zu der letzten Zeile kommen können.


    Die `PiCamera` ist ein Kontextmanager, kann also mit ``with`` verwendet werden. Und sollte es auch.


    Das Formatieren des Zeitstempels ist reichlich umständlich. Man kann die Zeichen zwischen den Werten auch mit in die Formatierung schreiben, dann braucht man nicht ständig {0:…} für jeden Teilwert.

    Jürgen Böhm Der Link ist ja nicht zu *einem* Kühlschrank sondern zu einer Suchergebnisseite mit vielen Kühlschränken. Mir war schon klar das mindestens einer davon dann wohl einen Raspi und einen Touchscreen verbaut hat, aber welcher hätte ich nicht sagen können. Und jeden anklicken wollte ich auch nicht. Erst das „Sieh Dir die Kiste auf dem Schrank an, von vorn ist der Touchscreen zu sehen.“ hat geholfen, denn auf der Übersichtsseite habe ich das nicht als Touchscreen identifizieren können.