2015-03-02 21 views
5

Ich versuche, ein kleines Python-Programm zum Herunterfahren zu schreiben oder Reboot my Raspberry PI, angetrieben von einer Taste mit einem GPIO verbunden. Das Programm kann den aktuellen Status der Raspberry PI (Booten, Laufen, Anhalten, Neustarten) über zwei LEDs anzeigen. Das Python-Programm wird als Daemon ausgeführt, gestartet von einem init.d Bash-Skript (geschrieben mit /etc/init.d/skeleton).Nachricht an ein Python-Skript senden

Jetzt kann ich den Status des Daemon starten/stoppen/verifizieren, und der Daemon kann die Eingabe überprüfen, wo die Schaltfläche verbunden ist, um den Befehl "shutdown -h now" oder "shutdown -r now" auszuführen.

Um den aktuellen Status des Raspberry PI anzuzeigen, hatte ich überlegt, Nachrichten an den Daemon zu senden, indem ich ein Skript in den Runlevels-Directorys verwendete, um den Status der LEDs zu ändern. Aber ich weiß nicht, wie Nachricht im Python-Programm erhalten.

Jemand kann mir helfen?

Danke.

Antwort

6

Es gibt mehrere Methoden, um eine Nachricht von einem Skript/app zum anderen senden:

Für Sie Anwendung eine gültige Methode ist eine Named Pipe zu verwenden. Erstelle es mit os.mkfifo, öffne es schreibgeschützt in deiner Python-App und warte auf Nachrichten darauf.

Wenn Sie Ihre App will eine andere Dinge zu tun, während des Wartens, ich empfehle Ihnen das Rohr öffnen im Modus non-blocking für Datenverfügbarkeit zu suchen, ohne das Skript, wie in folgendem Beispiel blockiert:

import os, time 

pipe_path = "/tmp/mypipe" 
if not os.path.exists(pipe_path): 
    os.mkfifo(pipe_path) 
# Open the fifo. We need to open in non-blocking mode or it will stalls until 
# someone opens it for writting 
pipe_fd = os.open(pipe_path, os.O_RDONLY | os.O_NONBLOCK) 
with os.fdopen(pipe_fd) as pipe: 
    while True: 
     message = pipe.read() 
     if message: 
      print("Received: '%s'" % message) 
     print("Doing other stuff") 
     time.sleep(0.5) 

Sie dann senden von Nachrichten von bash-Skripte können den Befehl

echo "your message" > /tmp/mypipe

EDIT: ich kann nicht richtig select.select bekommen arbeiten (ich habe es nur in C-Programme) Also habe ich meine Empfehlung in einen Nicht-Blokking-Modus geändert.

+0

Tanks viel! Ich werde versuchen, die "Named Pipe" Weg ... – EffegiWeb

+0

Ich verstehe nicht die Verwendung von 'select.select()' Funktion im Falle der Überprüfung einer Datei. Können Sie mir mit einem Beispiel helfen? Ich muss auf Nachrichten in einer Endlosschleife warten. – EffegiWeb

+0

Ich kann Select.select nicht richtig funktionieren (ich habe es nur in C-Programmen verwendet), also habe ich meine Empfehlung in einen Nicht-Bloking-Modus geändert und ein Beispiel hinzugefügt. – Patxitron

0

Ist diese Version nicht bequemer? Mit dem with costruct innerhalb der while true: Schleife? Auf diese Weise ist der gesamte andere Code innerhalb der Schleife auch im Falle eines Fehlers in der Pipe-Dateiverwaltung ausführbar. Schließlich kann ich die try: costuct für das Abfangen des Fehlers verwenden.

import os, time 

pipe_path = "/tmp/mypipe" 
if not os.path.exists(pipe_path): 
    os.mkfifo(pipe_path) 
# Open the fifo. We need to open in non-blocking mode or it will stalls until 
# someone opens it for writting 
pipe_fd = os.open(pipe_path, os.O_RDONLY | os.O_NONBLOCK) 

while True: 
    with os.fdopen(pipe_fd) as pipe: 
     message = pipe.read() 
     if message: 
      print("Received: '%s'" % message) 

    print("Doing other stuff") 
    time.sleep(0.5) 
+0

Es ist nicht sicher zu fdopen mehrmals eine Pipe/Datei geöffnet mit os.open. Wenn die "with" -Anweisung den Gültigkeitsbereich verlässt (der Ausdruck "Doing other stuff"), schließt sie den Dateideskriptor und kann nicht erneut geöffnet werden. Auch wenn Sie die Pipe schließen, während ein anderer Prozess verbunden ist, empfängt dieser Prozess das Signal SIGPIPE und beendet höchstwahrscheinlich seine Ausführung. Sie sollten die Pipe ständig geöffnet halten, während Sie sich in der Schleife befinden. – Patxitron

+0

@Patxitron: Vielen Dank für die Informationen. – EffegiWeb