Как включить RPi.GPIO в CGI-скрипт на python с помощью lighttpd?


13

Недавно я настроил python для работы с lighttpd через CGI (см. Здесь ). Но в ту минуту, когда я включаю RPi.GPIO , скрипт перестает выполняться (я полагаю, потому что HTML не выводится), но в журнал ошибок не выводится ошибка ( /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>"

Почему скрипт не выполняется? Это из-за разрешений? Конечно, в том числе библиотека не должна требовать каких-либо специальных разрешений? Почему в скрипте или в журнале ошибок нет ошибок?


Это может быть одно или оба из следующих разрешений / владения включенным файлом или расположением файлов. Чтобы устранить проблему, попробуйте переместить включенный файл в тот же каталог, где находится файл, который вы пытаетесь запустить, и убедитесь, что он принадлежит тому же пользователю, что и выполняемый скрипт. Если это решит проблему, сообщите нам об этом, и мы сможем направить вас дальше по настройке прав доступа / владельца и пути включения поиска.
Стив Робиллард

Я новичок в Python, является ли RPi.GPIO актуальным файлом (где он находится)? \ cgi-bin \ gpio.py принадлежит pi: pi, а разрешения для каталога www - www-data: www-data.
Марк Ингрэм

Хорошо, пара вещей, которые нужно запускать любому файлу, необходимому для управления выводами GPIO, от имени пользователя root (что откроет дыру в безопасности при работе через Интернет). Сказав, что вам будет легче отлаживать любые проблемы, если вы заставите скрипт работать из командной строки, прежде чем пытаться заставить lighttpd и CGI работать от имени пользователя root. Чтобы установить модуль RPi.GPIO, следуйте этим инструкциям learn.adafruit.com/… . Есть ли у вас опыт работы с электроникой? Что вы собираетесь делать с выводами GPIO
Стив Робиллард

1
Ах, я только что проверил это, и простой скрипт import RPi.GPIO as GPIOдействительно требует привилегий root! Теперь, я думаю, мне нужно, чтобы lighttpd работал от имени пользователя root (это просто домашний проект).
Марк Ингрэм

1
проверьте это как вариант для запуска от имени root stackoverflow.com/questions/89228/…
Стив Робиллард

Ответы:


6

Вы можете попробовать добавить перед импортом RPi.GPIO:

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

Это может помочь диагностировать ошибку.

И добавьте эти строки перед выводом html:

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

См. Http://docs.python.org/library/cgi.html.


6

Следуя совету от okertanov, я обнаружил, что вы не можете использовать RPi.GPIOскрипт Python CGI, поскольку он требует root-доступа. Я обошел проблему, вызвав gpioприложение командной строки, которое входит в состав WiringPi , это можно вызвать из учетной записи без полномочий 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

# означает комментарий в Python

Просто используйте

import RPi.GPIO as GPIO

Теперь вам нужно решить проблему с разрешениями


Извините, это была моя ошибка, я скопировал код, закомментированный в этой строке. Я удалил это из исходного вопроса.
Марк Ингрэм

0

В этом руководстве рекомендуется создать специальную копию Python и предоставить ему привилегии пользователя 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

А затем, чтобы сделать свой CGI, перейдите на страницу sudo nano /etc/lighttpd/lighttpd.confи найдите, куда вы направляете .pyфайлы, и перейдите /usr/bin/python/на новый /usr/bin/pythonRoot/

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.