¿Cómo incluir RPi.GPIO en un script Python CGI con lighttpd?

13

Recientemente configuré Python para trabajar con lighttpd a través de CGI (ver aquí ). Pero en el momento en que incluyo RPi.GPIO , el script deja de ejecutarse (supongo que no se genera HTML), pero no hay salida de error en el registro de errores ( /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>"

¿Por qué no se ejecuta el script? ¿Es por los permisos? ¿Seguramente, incluir la biblioteca no debería requerir ningún permiso especial? ¿Por qué no hay ninguna salida de error en el script o en el registro de errores?

Mark Ingram
fuente
Es probable que este sea uno o ambos de los siguientes permisos / propiedad del archivo incluido o la ubicación de los archivos. Para corregir el problema, intente mover el archivo incluido al mismo directorio que el archivo que está intentando ejecutar y asegúrese de que sea propiedad del mismo usuario que el script que está ejecutando. Si esto resuelve el problema, infórmenos y podemos orientarlo más sobre cómo configurar los permisos / propiedad y la ruta de búsqueda de inclusión.
Steve Robillard
Soy un novato con Python, ¿RPi.GPIO es un archivo real (dónde está)? \ cgi-bin \ gpio.py es propiedad de pi: pi y los permisos para el directorio www son www-data: www-data.
Mark Ingram el
De acuerdo, un par de cosas que cualquier archivo que necesite controlar los pines GPIO deberá ejecutarse como root (lo que abrirá un agujero de seguridad cuando se haga a través de la web). Una vez dicho esto, será más fácil depurar cualquier problema si logra que el script funcione desde la línea de comandos antes de intentar que lighttpd y CGI se ejecuten como root. Para instalar el módulo RPi.GPIO, siga estas instrucciones learn.adafruit.com/… . ¿Tienes alguna experiencia en electrónica? ¿Qué ibas a hacer con los pines GPIO
Steve Robillard
1
¡Ah, acabo de probar esto, y un simple script de import RPi.GPIO as GPIOrealmente requiere privilegios de root! Ahora supongo que necesito que lighttpd se ejecute como root (es solo un proyecto casero).
Mark Ingram el
1
mira esto como una opción para ejecutar como root stackoverflow.com/questions/89228/…
Steve Robillard

Respuestas:

6

Puede intentar agregar antes de 'importar RPi.GPIO':

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

Puede ser útil diagnosticar un error.

Y agregue estas líneas antes de su salida html:

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

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

okertanov
fuente
6

Después de seguir los consejos de okertanov, descubrí que en realidad no se puede usar RPi.GPIOen un script Python CGI, ya que requiere acceso de root. Resolví el problema llamando a la gpioaplicación de línea de comandos que se incluye como parte de WiringPi , esto se puede llamar desde una cuenta no 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
Mark Ingram
fuente
0

# significa un comentario en Python

Solo usa

import RPi.GPIO as GPIO

Ahora deberás resolver el problema de permisos

John La Rooy
fuente
Lo siento, fue mi error, había copiado mi código que tenía esa línea comentada. Lo he eliminado de la pregunta original.
Mark Ingram
0

Este tutorial recomienda crear una copia especial de Python y otorgarle privilegios de usuario root, de esta manera:

//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

Y luego, para hacer su CGI, vaya sudo nano /etc/lighttpd/lighttpd.confy busque donde sea que esté dirigiendo .pyarchivos y cambie /usr/bin/python/al nuevo /usr/bin/pythonRoot/

Seph Reed
fuente