2015-03-02 13 views
5

Sto provando a scrivere un piccolo programma python per l'arresto o il riavvio del mio Raspberry PI, pilotato da un pulsante collegato a un GPIO. Il programma può mostrare lo stato corrente del lampone PI (Booting, Running, Halting, Rebooting) tramite due led. Il programma python viene eseguito come demone, avviato da uno script init.d bash (scritto usando /etc/init.d/skeleton).Invia messaggio a uno script Python

Ora posso avviare/arrestare/verificare lo stato del daemon e il daemon può controllare l'input a cui è collegato il pulsante, per eseguire il comando "shutdown -h now" o "shutdown -r now".

Per mostrare lo stato corrente del PI del lampone, avevo pensato di inviare messaggi al demone, usando qualche script nei director di runlevel, per cambiare lo stato dei led. Ma non so come ricevere messaggi nel programma python.

Qualcuno può aiutarmi?

Grazie.

risposta

6

Ci sono diversi metodi per inviare un messaggio da uno script/applicazione ad un altro:

Per voi l'applicazione di un metodo valido è quello di utilizzare una named pipe. Crealo usando os.mkfifo, aprilo in sola lettura nella tua app Python e attendi i messaggi su di esso.

Se volete che il vostro app per fare un altro le cose durante l'attesa, mi raccomando si apre il tubo in modalità non-blocking per cercare la disponibilità dei dati senza bloccare lo script come nel seguente esempio:

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) 

Poi si possibile inviare messaggi dal script bash utilizzando il comando

echo "your message" > /tmp/mypipe

EDIT: non riesco a select.select funziona correttamente (io ho usato solo nei programmi C) così ho cambiato la mia raccomandazione in una modalità non-bloking.

+0

Serbatoi molto! Proverò il modo "named pipe" ... – EffegiWeb

+0

Non capisco l'uso della funzione 'select.select()' in caso di controllo di un file. Potete aiutarmi con un esempio? Ho bisogno di aspettare i messaggi in un ciclo infinito. – EffegiWeb

+0

Non riesco a selezionare select.select funzionando correttamente (l'ho usato solo nei programmi C), quindi ho cambiato la mia raccomandazione in modalità non-bloking e aggiunto un esempio. – Patxitron

0

Non è più conveniente questa versione? Con il costrutto with all'interno del ciclo while true:? In questo modo, tutti gli altri codici all'interno del loop sono eseguibili anche in caso di errore nella gestione dei file pipe. Alla fine posso usare il try: costuct per la cattura dell'errore.

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

Non è sicuro fdopen più volte una pipe/file aperta con os.open. Quando la frase "with" non rientra nello scope (la frase print ("Doing other stuff")) chiude il descrittore del file e non può essere riaperto. Inoltre si chiude il tubo mentre è connesso un altro processo, tale processo riceverà il segnale SIGPIPE e molto probabilmente terminerà la sua esecuzione. Dovresti mantenere aperto il tubo tutto il tempo che sei nel ciclo. – Patxitron

+0

@Patxitron: Grazie per l'informazione. – EffegiWeb

Problemi correlati