Wie binde ich RPi.GPIO in ein Python-CGI-Skript mit lighttpd ein?


13

Ich habe kürzlich Python so eingerichtet, dass es mit lighttpd über CGI funktioniert (siehe hier ). Aber sobald ich RPi.GPIO einbinde , wird das Skript nicht mehr ausgeführt (ich gehe davon aus, dass kein HTML ausgegeben wird), aber es gibt keine Fehlerausgabe im Fehlerprotokoll ( /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>"

Warum wird das Skript nicht ausgeführt? Liegt es an Berechtigungen? Sicher, einschließlich der Bibliothek sollten keine besonderen Berechtigungen erforderlich sein? Warum wird weder im Skript noch im Fehlerprotokoll ein Fehler ausgegeben?


Hierbei handelt es sich wahrscheinlich um eine oder beide der folgenden Berechtigungen / Eigentumsrechte für die enthaltene Datei oder den Speicherort der Dateien. Um das Problem zu beheben, verschieben Sie die enthaltene Datei in dasselbe Verzeichnis wie die Datei, die Sie ausführen möchten, und stellen Sie sicher, dass derselbe Benutzer Eigentümer des Skripts ist, das Sie ausführen. Wenn dies das Problem löst, lassen Sie es uns wissen und wir können Sie weiter über das Festlegen der Berechtigungen / Eigentumsrechte und des Suchpfads für das Einschließen informieren.
Steve Robillard

Ich bin ein Neuling in Python. Ist RPi.GPIO eine aktuelle Datei (wo ist sie?)? \ cgi-bin \ gpio.py gehört pi: pi und die Berechtigungen für das WWW-Verzeichnis lauten www-data: www-data.
Mark Ingram

OK, einige Dinge, die eine Datei zur Steuerung der GPIO-Pins benötigt, müssen als root ausgeführt werden (was bei der Ausführung über das Web eine Sicherheitslücke öffnet). Wenn Sie jedoch versuchen, lighttpd und CGI als root auszuführen, können Sie Probleme leichter debuggen, wenn Sie das Skript über die Befehlszeile zum Laufen bringen. Befolgen Sie zur Installation des RPi.GPIO-Moduls diese Anweisungen unter learn.adafruit.com/… . Haben Sie Erfahrung in der Elektronik? Was wolltest du mit den GPIO-Pins machen
Steve Robillard

1
Ah, ich habe das gerade getestet und für ein einfaches Skript von sind import RPi.GPIO as GPIORoot-Rechte erforderlich! Jetzt muss ich wohl lighttpd als root ausführen (es ist nur ein Heimprojekt).
Mark Ingram

Antworten:


6

Sie können versuchen, Folgendes hinzuzufügen, bevor Sie 'RPi.GPIO importieren':

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

Es kann hilfreich sein, einen Fehler zu diagnostizieren.

Und fügen Sie diese Zeilen vor Ihrer HTML-Ausgabe hinzu:

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

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


6

Nachdem ich den Rat von okertanov befolgt hatte, stellte ich fest, dass Sie RPi.GPIOein Python-CGI-Skript nicht verwenden können, da es Root-Zugriff erfordert. Ich habe das Problem umgangen , indem ich die gpioKommandozeilen-App aufgerufen habe , die als Teil von WiringPi enthalten ist. Diese kann von einem Nicht-Root-Konto aus aufgerufen werden.

# 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

# bedeutet einen Kommentar in Python

Benutz einfach

import RPi.GPIO as GPIO

Jetzt müssen Sie das Berechtigungsproblem lösen


Tut mir leid, das war mein Fehler, ich hatte meinen Code kopiert, in dem diese Zeile auskommentiert war. Ich habe es aus der ursprünglichen Frage entfernt.
Mark Ingram

0

In diesem Lernprogramm wird empfohlen, eine spezielle Kopie von Python zu erstellen und ihm Root-Benutzerrechte zu erteilen.

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

Und dann, um Ihr CGI zu erstellen , gehen Sie zu sudo nano /etc/lighttpd/lighttpd.confund suchen Sie, wo immer es sich befindet. Sie leiten .pyDateien von und wechseln /usr/bin/python/auf das neue /usr/bin/pythonRoot/

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.