Як включити RPi.GPIO в CGI-сценарій пітона з 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-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/…
Steve Robillard

Відповіді:


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

Дотримуючись поради окертанових, я виявив, що насправді ви не можете використовувати RPi.GPIOв CGI-скрипті пітона, оскільки він вимагає кореневого доступу. Я вирішив проблему, зателефонувавши в gpioдодаток командного рядка, що входить до складу WiringPi , це можна викликати з некореневого облікового запису.

# 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.