Comment inclure RPi.GPIO dans un script CGI python avec lighttpd?

13

J'ai récemment configuré python pour travailler avec lighttpd via CGI (voir ici ). Mais à la minute où j'inclus RPi.GPIO , le script s'arrête de s'exécuter (je suppose parce qu'aucun HTML ne reçoit de sortie), mais il n'y a pas de sortie d'erreur dans le journal des erreurs ( /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>"

Pourquoi le script ne s'exécute-t-il pas? Est-ce à cause des autorisations? Assurément, y compris la bibliothèque ne devrait pas exiger d'autorisations spéciales? Pourquoi n'y a-t-il pas de sortie d'erreur dans le script ou dans le journal des erreurs?

Mark Ingram
la source
Il s'agit probablement d'une ou des deux autorisations / propriété suivantes du fichier inclus ou de l'emplacement des fichiers. Pour corriger le problème, essayez de déplacer le fichier inclus dans le même répertoire que le fichier que vous essayez d'exécuter et assurez-vous qu'il appartient au même utilisateur que le script que vous exécutez. Si cela résout le problème, faites-le nous savoir et nous pourrons vous orienter davantage sur la définition des autorisations / propriété et la définition du chemin de recherche d'inclusion.
Steve Robillard
Je suis un débutant avec Python, RPi.GPIO est-il un fichier réel (où est-il)? \ cgi-bin \ gpio.py appartient à pi: pi et les autorisations pour le répertoire www sont www-data: www-data.
Mark Ingram
OK, quelques choses que tout fichier ayant besoin de contrôler les broches GPIO devra s'exécuter en tant que root (ce qui ouvrira une faille de sécurité une fois effectué via le Web). Cela dit, vous aurez plus de facilité à déboguer les problèmes si vous faites fonctionner le script à partir de la ligne de commande avant d'essayer de faire fonctionner lighttpd et CGI en tant que root. Pour installer le module RPi.GPIO, suivez ces instructions learn.adafruit.com/… . Avez-vous une expérience en électronique? Qu'alliez-vous faire avec les broches GPIO
Steve Robillard
1
Ah, je viens de le tester, et un simple script de import RPi.GPIO as GPIOnécessite des privilèges root! Maintenant, je suppose que je dois faire fonctionner lighttpd en tant que root (c'est juste un projet personnel).
Mark Ingram
1
vérifier cela comme une option pour exécuter en tant que root stackoverflow.com/questions/89228/…
Steve Robillard

Réponses:

6

Vous pouvez essayer d'ajouter avant «importer RPi.GPIO»:

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

Il peut être utile de diagnostiquer une erreur.

Et ajoutez ces lignes avant votre sortie html:

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

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

okertanov
la source
6

Après avoir suivi les conseils d'okertanov, j'ai découvert que vous ne pouvez pas réellement utiliser RPi.GPIOdans un script CGI python car il nécessite un accès root. J'ai contourné le problème en appelant l' gpioapplication de ligne de commande qui est incluse dans le cadre de WiringPi , cela peut être appelé à partir d'un compte 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
Mark Ingram
la source
0

# signifie un commentaire en Python

Utilisez simplement

import RPi.GPIO as GPIO

Vous devez maintenant résoudre le problème des autorisations

John La Rooy
la source
Désolé, c'était mon erreur, j'avais copié mon code qui avait cette ligne commentée. Je l'ai supprimé de la question d'origine.
Mark Ingram
0

Ce tutoriel recommande de créer une copie spéciale de Python et de lui donner des privilèges d'utilisateur root, comme ceci:

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

Et puis, pour créer votre CGI, allez sudo nano /etc/lighttpd/lighttpd.confet trouvez où vous êtes en train de diriger les .pyfichiers et passez au /usr/bin/python/nouveau /usr/bin/pythonRoot/

Seph Reed
la source