Come includere RPi.GPIO in uno script CGI python con lighttpd?


13

Di recente ho configurato Python per funzionare con lighttpd tramite CGI (vedi qui ). Ma nel momento in cui vado a includere RPi.GPIO , lo script smette di essere eseguito (presumo perché non viene generato alcun HTML), ma non viene generato alcun errore nel registro degli errori ( /var/log/lighttpd/error.log).

gpio.py

import RPi.GPIO as GPIO

print "<html>"
print "\t<head>"
print "\t\t<title>GPIO</title>"
print "\t</head>"
print "\t<body>"
print "\t\t<p>"
print "\t\t\tGPIO #17 status: "
print "\t\t</p>"
print "\t</body>"
print "</html>"

Perché lo script non viene eseguito? È a causa delle autorizzazioni? Sicuramente, inclusa la biblioteca non dovrebbe richiedere autorizzazioni speciali? Perché non c'è alcun output di errore nello script o nel registro degli errori?


È probabile che si tratti di una o entrambe le seguenti autorizzazioni / proprietà del file incluso o del percorso dei file. Per correggere il problema, prova a spostare il file incluso nella stessa directory del file che stai tentando di eseguire e assicurati che sia di proprietà dello stesso utente dello script che stai eseguendo. Se questo risolve il problema fatecelo sapere e possiamo indirizzarvi ulteriormente sull'impostazione delle autorizzazioni / proprietà e sull'impostazione del percorso di ricerca include.
Steve Robillard,

Sono un principiante con Python, RPi.GPIO è un file reale (dove si trova)? \ cgi-bin \ gpio.py è di proprietà di pi: pi e le autorizzazioni per la directory www sono www-data: www-data.
Mark Ingram

OK, un paio di cose che qualsiasi file necessiti per controllare i Pin GPIO dovrà essere eseguito come root (che aprirà un buco di sicurezza quando fatto via web). Detto questo, sarà più facile eseguire il debug di eventuali problemi se si riesce a far funzionare lo script dalla riga di comando prima di provare a far funzionare lighttpd e CGI come root. Per installare il modulo RPi.GPIO segui queste istruzioni learn.adafruit.com/… . Hai qualche esperienza nell'elettronica? Cosa avresti fatto con i pin GPIO
Steve Robillard il

1
Ah, l'ho appena provato, e un semplice script import RPi.GPIO as GPIOrichiede effettivamente i privilegi di root! Ora credo di aver bisogno di far funzionare lighttpd come root (è solo un progetto home).
Mark Ingram

1
controlla come un'opzione per l'esecuzione come root stackoverflow.com/questions/89228/…
Steve Robillard

Risposte:


6

Puoi provare ad aggiungere prima di 'import RPi.GPIO':

import sys 
sys.stderr = sys.stdout
try:
    import RPi.GPIO as GPIO
except Exception as e:
    print e

Può aiutare a diagnosticare un errore.

E aggiungi queste righe prima del tuo output html:

print "Content-Type: text/html"     # HTML is following
print                               # blank line, end of headers

Vedi http://docs.python.org/library/cgi.html


6

Dopo aver seguito il consiglio di okertanov, ho scoperto che in realtà non è possibile utilizzare RPi.GPIOuno script CGI python in quanto richiede l'accesso come root. Ho risolto il problema chiamando l' gpioapp della riga di comando inclusa in WiringPi , che può essere chiamata da un account non root.

# Read the GPIO pin using the gpio application

import subprocess as s

def ReadGpio(pin) :
    process = s.Popen(["/usr/local/bin/gpio", "-g", "read", pin], stdout = s.PIPE)
    data, _ = process.communicate()

    data = str.replace(data, \r”, “”)
    data = str.replace(data, \n”, “”)

    return data

0

# significa un commento in Python

Basta usare

import RPi.GPIO as GPIO

Ora dovrai risolvere il problema delle autorizzazioni


Mi dispiace che sia stato un mio errore, avevo copiato il mio codice che aveva commentato quella riga. L'ho rimosso dalla domanda originale.
Mark Ingram,

0

Questo tutorial consiglia di creare una copia speciale di Python e di assegnargli i privilegi dell'utente root, in questo modo:

//check current version
pi@raspberrypi /var/www $ ls -l /usr/bin/python
lrwxrwxrwx 1 root root 9 Jun  6  2012 /usr/bin/python -> python2.7

//copy and chmod
pi@raspberrypi /var/www $ sudo cp /usr/bin/python2.7 /usr/bin/pythonRoot
pi@raspberrypi /var/www $ sudo chmod u+s /usr/bin/pythonRoot

//check that new version has more priveledges
pi@raspberrypi /var/www $ ls -l /usr/bin/pythonRoot
-rwsr-xr-x 1 root root 2674528 Mar 17 18:16 /usr/bin/pythonRoot

E poi, per rendere il tuo CGI, vai a sudo nano /etc/lighttpd/lighttpd.confe trova ovunque tu stia dirigendo i .pyfile e /usr/bin/python/passa al nuovo /usr/bin/pythonRoot/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.