Kommando 2 mal ausführen

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
TheGreenJosip
User
Beiträge: 4
Registriert: Donnerstag 24. Januar 2019, 22:54

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])
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

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.
Benutzeravatar
__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! :twisted:

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
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

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
Benutzeravatar
__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
TheGreenJosip
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 :shock:

Da ich in der ganzen Materie ziemlich neu bin, und nach langer Recherche nichts finden konnte, hab ich mich gleich an euch gewandt! :roll:

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! :)
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

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])
TheGreenJosip
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?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Persoenlich? Nein. Natuerlich kannst du bei Fragen und Problemen die hier weiter diskutieren, aber ob nun speziell ich dazu etwas sagen werde hat damit ja nichts zu tun.
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

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 :shock:
...
Würde das nur ungern alles verändern, da es wirklich gut funktioniert, bis auf das wiederholen des Power Off knopfes...
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.
Ein brauchbares Tutorial gibt es in der Python Doku.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

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])
TheGreenJosip
User
Beiträge: 4
Registriert: Donnerstag 24. Januar 2019, 22:54

Yesss hat funktioniert 8)
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 :mrgreen:
Ich bedanke mich nochmals für eure tolle Hilfe!

Werd in Zukunft sicher nochmal auf euch zurückkommen :P
Antworten