Jak dołączyć RPi.GPIO do skryptu CGI Pythona za pomocą lighttpd?

13

Niedawno skonfigurowałem Pythona do pracy z lighttpd przez CGI (patrz tutaj ). Ale z chwilą, gdy dołączę RPi.GPIO , skrypt przestaje działać ( zakładam , ponieważ HTML nie otrzymuje danych wyjściowych), ale nie ma danych wyjściowych błędów w dzienniku błędów ( /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>"

Dlaczego skrypt się nie uruchamia? Czy to z powodu uprawnień? Z pewnością, w tym biblioteka nie powinna wymagać żadnych specjalnych uprawnień? Dlaczego w skrypcie lub w dzienniku błędów nie ma żadnych błędów?

Mark Ingram
źródło
Może to być jedno lub oba z następujących uprawnień / własności dołączonego pliku lub lokalizacji plików. Aby rozwiązać problem, spróbuj przenieść dołączony plik do tego samego katalogu, co plik, który próbujesz uruchomić, i upewnij się, że jest własnością tego samego użytkownika co uruchomiony skrypt. Jeśli to rozwiąże problem, daj nam znać, a my możemy skierować cię dalej w sprawie ustawiania uprawnień / własności i ustawiania ścieżki wyszukiwania.
Steve Robillard,
Jestem nowicjuszem w Pythonie, czy RPi.GPIO to rzeczywisty plik (gdzie to jest)? \ cgi-bin \ gpio.py jest własnością pi: pi, a uprawnienia do katalogu www to www-data: www-data.
Mark Ingram,
OK, kilka rzeczy, które muszą być kontrolowane przez piny GPIO, muszą być uruchamiane jako root (co otworzy lukę w zabezpieczeniach, gdy zostanie wykonane przez Internet). Powiedziawszy, że łatwiej będzie ci debugować jakiekolwiek problemy, jeśli skrypt zacznie działać z wiersza poleceń, zanim spróbujesz uruchomić lighttpd i CGI jako root. Aby zainstalować moduł RPi.GPIO, postępuj zgodnie z tymi instrukcjami learn.adafruit.com/… . Czy masz jakieś doświadczenie z elektroniką? Co zamierzałeś zrobić z pinami GPIO
Steve Robillard
1
Ach, właśnie to przetestowałem, a prosty skrypt import RPi.GPIO as GPIOfaktycznie wymaga uprawnień roota! Teraz myślę, że muszę uruchomić lighttpd, aby działał jako root (to tylko projekt domowy).
Mark Ingram,
1
sprawdź to jako opcję uruchamiania jako root stackoverflow.com/questions/89228/…
Steve Robillard

Odpowiedzi:

6

Możesz spróbować dodać przed 'import RPi.GPIO':

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

Może to pomóc zdiagnozować błąd.

I dodaj te wiersze przed wyjściem HTML:

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

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

okertanov
źródło
6

Po skorzystaniu z porady okertanova odkryłem, że nie można używać RPi.GPIOskryptu CGI w Pythonie, ponieważ wymaga on dostępu do konta root. Obejrzałem ten problem, wywołując gpioaplikację wiersza polecenia, która jest częścią WiringPi , można ją wywołać z konta innego niż 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
źródło
0

# oznacza komentarz w Pythonie

Po prostu użyj

import RPi.GPIO as GPIO

Teraz musisz rozwiązać problem z uprawnieniami

John La Rooy
źródło
Przepraszam, to był mój błąd. Skopiowałem kod, który został skomentowany. Usunąłem go z pierwotnego pytania.
Mark Ingram
0

W tym samouczku zaleca się utworzenie specjalnej kopii języka Python i nadanie mu uprawnień użytkownika root:

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

A następnie, aby utworzyć swój CGI, przejdź do sudo nano /etc/lighttpd/lighttpd.confi znajdź, gdzie to jest, gdzie kierujesz .pypliki i przejdź /usr/bin/python/do nowego /usr/bin/pythonRoot/

Seph Reed
źródło