Liebe Python Community!
Ich bin auf diesem Gebiet sehr neu und deswegen wende ich mich mit meinem Problem an euch.
Es handelt sich um einen Raspberry Pi 3 mit welchem ich über LIRC meine Infrarotgeräte steuere.
Derzeit funktioniert das nur mit dem Beamer, allerdings auch nicht so wie ich das möchte...
Zum Ausschalten des Beamers muss der Power Knopf 2 mal gedrückt werden damit er runterfährt und ich schaffe es nicht diese Funktion in das Script zu integrieren....
Unten seht ihr die Datei, ich wäre sehr froh, wenn ihr mir dabei helfen könntet!
Der irsend Befehl soll einfach 2 mal ausgeführt werden und ich kriege es nicht hin...
liebe grüße,
Josip
import os
import sys
import time
def IRremoteSend(remote, key):
try:
os.kill(os.system("pidof lircd"), 0)
except OSError:
os.system("sudo lircd -d /dev/lirc0")
cmd = "irsend SEND_ONCE %s %s" % (remote, key)
os.system(cmd)
if __name__ == '__main__':
IRremoteSend(sys.argv[1], sys.argv[2])
Kommando 2 mal ausführen
Ich muss zugeben, dass ich die Frage nicht so ganz verstehe. Was hält dich denn davon ab, den Befehl noch einmal so auszuführen, wie du es getan hast?
Ansonsten mal eine ketzerische Gegenfrage: Warum hast du das in Python geschrieben und nicht einfach als Shell-Skript? Die komplette Funktionalität wird ja durch externe Aufrufe abgedeckt und abgesehen von dem Try-Except gibt es keinerlei Kontrollstrukturen oder irgendwas, was die Verwendung von Python sinnvoll macht. Umgekehrt hast du durch die ganzen Aufrufe von os.system (von dessen Verwendung in der Regel auch zugunsten von subprocess abgeraten wird) sogar noch zusätzlichen Overhead.
Ansonsten mal eine ketzerische Gegenfrage: Warum hast du das in Python geschrieben und nicht einfach als Shell-Skript? Die komplette Funktionalität wird ja durch externe Aufrufe abgedeckt und abgesehen von dem Try-Except gibt es keinerlei Kontrollstrukturen oder irgendwas, was die Verwendung von Python sinnvoll macht. Umgekehrt hast du durch die ganzen Aufrufe von os.system (von dessen Verwendung in der Regel auch zugunsten von subprocess abgeraten wird) sogar noch zusätzlichen Overhead.
- __blackjack__
- User
- Beiträge: 13079
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Das ``try``/``except`` ist hier auch überflüssig, denn entweder geht das sowieso immer in den ``except``-Teil weil man als normaler Benutzer die Prozesse 0 oder 1 nicht killen kann, oder man führt das als Administrator aus und killt sich den Prozess 0 oder 1, je nach dem was ``pidof`` als *Rückgabecode* liefert. Aua!
Edit: Okay, ich hatte das Signal nicht beachtet: es wird eine 0 ”gesendet”. Das macht es aber nicht sinnvoller, denn entweder klappt das immer wenn die PID 0 geprüft wird, oder es klappt als normaler Benutzer nie wenn die PID 1 geprüft wird, oder immer wenn man das als `root` macht. Es ist auf jeden Fall alles sehr unsinnig, insbesondere das `kill`.
Edit: Okay, ich hatte das Signal nicht beachtet: es wird eine 0 ”gesendet”. Das macht es aber nicht sinnvoller, denn entweder klappt das immer wenn die PID 0 geprüft wird, oder es klappt als normaler Benutzer nie wenn die PID 1 geprüft wird, oder immer wenn man das als `root` macht. Es ist auf jeden Fall alles sehr unsinnig, insbesondere das `kill`.
Zuletzt geändert von __blackjack__ am Freitag 25. Januar 2019, 20:51, insgesamt 1-mal geändert.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Zum Glück macht das Signal 0 ja nichts ernsthaftes, sondern checkt nur, ob man ein Signal senden darf
Pidof hat ansonsten ja auch die Eigenschaft, dass es bei mehreren Prozessen auch mehrere PIDs zurückgibt. Das wäre unabhängig davon, dass der Rückgabewert verwendet wird, auch noch mal problematisch
Pidof hat ansonsten ja auch die Eigenschaft, dass es bei mehreren Prozessen auch mehrere PIDs zurückgibt. Das wäre unabhängig davon, dass der Rückgabewert verwendet wird, auch noch mal problematisch
- __blackjack__
- User
- Beiträge: 13079
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Hier das ”Python”-Programm mal als Shell-Skript:
Code: Alles auswählen
#!/bin/sh
pidof lircd > /dev/null || sudo lircd -d /dev/lirc0
irsend SEND_ONCE "$1" "$2"
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
-
- User
- Beiträge: 4
- Registriert: Donnerstag 24. Januar 2019, 22:54
Liebe Community!
Ich danke euch für die zahlreichen antworten und entschuldige mich für die etwas späte antwort, hatte nicht gesehen, dass schon jemand geantwortet hat!
Folgendes, es geht hierbei um eine Homebridge welche auf einem Pi 3 läuft und meine IR Fernbedieung für den Beamer emuliert.
Dachte mir, bevor ich irgendwas selbst herumprobiere, dass ich mir ein fertiges Plugin runterlade, welches die
funktionen die ich brauche schon unterstützt.
Der typ der es entworfen hat, hat aus irgendeinem
Grund python verwendet und das ist auch das erste mal für mich, dass ich mich mit der Sprache auseinandersetzen musste
Da ich in der ganzen Materie ziemlich neu bin, und nach langer Recherche nichts finden konnte, hab ich mich gleich an euch gewandt!
Würde das nur ungern alles verändern, da es wirklich gut funktioniert, bis auf das wiederholen des Power Off knopfes...
Deswegen meine Frage, kann man in das skript dir funktion integrieren, dass der State 0 zwei mal ausgeführt wird? 0 soll ja aus und 1 ein bedeuten!
Falls das nicht geht, muss ich mir natürlich eine andere lösung einfallen lassen, aber ich danke euch jetzt schon mal für die zahlreichen antworten, und hoffe, dass wir das Problem beseitigen können!
Ich danke euch für die zahlreichen antworten und entschuldige mich für die etwas späte antwort, hatte nicht gesehen, dass schon jemand geantwortet hat!
Folgendes, es geht hierbei um eine Homebridge welche auf einem Pi 3 läuft und meine IR Fernbedieung für den Beamer emuliert.
Dachte mir, bevor ich irgendwas selbst herumprobiere, dass ich mir ein fertiges Plugin runterlade, welches die
funktionen die ich brauche schon unterstützt.
Der typ der es entworfen hat, hat aus irgendeinem
Grund python verwendet und das ist auch das erste mal für mich, dass ich mich mit der Sprache auseinandersetzen musste
Da ich in der ganzen Materie ziemlich neu bin, und nach langer Recherche nichts finden konnte, hab ich mich gleich an euch gewandt!
Würde das nur ungern alles verändern, da es wirklich gut funktioniert, bis auf das wiederholen des Power Off knopfes...
Deswegen meine Frage, kann man in das skript dir funktion integrieren, dass der State 0 zwei mal ausgeführt wird? 0 soll ja aus und 1 ein bedeuten!
Falls das nicht geht, muss ich mir natürlich eine andere lösung einfallen lassen, aber ich danke euch jetzt schon mal für die zahlreichen antworten, und hoffe, dass wir das Problem beseitigen können!
Wenn man etwas 2mal machen will, muss man es halt zweimal machen. Und wahrscheinlich muss man zwischendurch auch ein bisschen warten.
Code: Alles auswählen
import os
import sys
import time
def IRremoteSend(remote, key):
cmd = "irsend SEND_ONCE %s %s" % (remote, key)
os.system(cmd)
time.sleep(.5)
os.system(cmd)
if __name__ == '__main__':
IRremoteSend(sys.argv[1], sys.argv[2])
-
- User
- Beiträge: 4
- Registriert: Donnerstag 24. Januar 2019, 22:54
Danke _deets_!
Ich werd das script heute abend probieren und dir dann bescheid geben ob’s funktioniert hat oder nicht : )
Darf ich mich ansonsten nochmal an dich wenden?
Ich werd das script heute abend probieren und dir dann bescheid geben ob’s funktioniert hat oder nicht : )
Darf ich mich ansonsten nochmal an dich wenden?
Ich kann verstehen, dass du es nicht ändern möchtest, weil es funktioniert. Leider ist der Code aber wirklich nicht gut. Das ist leider bei dem Code, der aus der Raspberry Pi Community kommt und hier im Forum landet ehrlich gesagt eher die Regel als die Ausnahme, denn vielen Raspberry Pi Nutzern geht es scheinbar eher darum, dass es funktioniert, weniger darum, dass es anständig programmiert ist. Das ist auch keine rein ästhetische Anforderung; bei solchen Scripten wie dem gezeigten kannst du nicht davon ausgehen, dass es dauerhaft gut funktioniert, bei sauber programmierten Code schon eher. Falls du Interesse daran hast, Python zu lernen, kann ich daher nur empfehlen, zu versuchen, das Skript noch Mal in "schönem" Python neuzuschreiben.TheGreenJosip hat geschrieben: ↑Montag 28. Januar 2019, 02:25 Der typ der es entworfen hat, hat aus irgendeinem
Grund python verwendet und das ist auch das erste mal für mich, dass ich mich mit der Sprache auseinandersetzen musste
...
Würde das nur ungern alles verändern, da es wirklich gut funktioniert, bis auf das wiederholen des Power Off knopfes...
Ein brauchbares Tutorial gibt es in der Python Doku.
Besser mit subprocess:
Code: Alles auswählen
import subprocess
import sys
import time
def remote_send(remote, key):
cmd = ["irsend", "SEND_ONCE", remote, key]
subprocess.call(cmd)
time.sleep(.5)
subprocess.call(cmd)
if __name__ == '__main__':
remove_send(sys.argv[1], sys.argv[2])
-
- User
- Beiträge: 4
- Registriert: Donnerstag 24. Januar 2019, 22:54
Yesss hat funktioniert
Nun macht er genau das was er soll, ich danke euch wirklich von Herzen!
Ich werde langfristig python lernen da ich solche dinge gerne selbst, ohne fremdes zutun, erledigen würde und dafür scheint es mir ganz gut geeignet, nur hab ich momentan leider keine Zeit dafür, steht aber schon auf der Liste
Ich bedanke mich nochmals für eure tolle Hilfe!
Werd in Zukunft sicher nochmal auf euch zurückkommen
Nun macht er genau das was er soll, ich danke euch wirklich von Herzen!
Ich werde langfristig python lernen da ich solche dinge gerne selbst, ohne fremdes zutun, erledigen würde und dafür scheint es mir ganz gut geeignet, nur hab ich momentan leider keine Zeit dafür, steht aber schon auf der Liste
Ich bedanke mich nochmals für eure tolle Hilfe!
Werd in Zukunft sicher nochmal auf euch zurückkommen