Como incluir RPi.GPIO em um script CGI python com lighttpd?

13

Recentemente, configurei o python para trabalhar com o lighttpd via CGI (veja aqui ). Mas no minuto em que incluo o RPi.GPIO , o script para de ser executado ( suponho que nenhum HTML seja gerado), mas não há erro no log de erros ( /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>"

Por que o script não está sendo executado? É por causa das permissões? Certamente, incluindo a biblioteca não deve exigir permissões especiais? Por que não há saída de erro no script ou no log de erros?

Mark Ingram
fonte
É provável que seja uma ou ambas as seguintes permissões / propriedade do arquivo incluído ou do local dos arquivos. Para corrigir o problema, tente mover o arquivo incluído para o mesmo diretório que o arquivo que você está tentando executar e verifique se ele pertence ao mesmo usuário que o script que você está executando. Se isso resolver o problema, informe-nos e podemos orientá-lo ainda mais sobre como definir as permissões / propriedade e como definir o caminho de pesquisa.
9788 Steve Robillard
Sou iniciante no Python, o RPi.GPIO é um arquivo real (onde está)? \ cgi-bin \ gpio.py pertence a pi: pi e as permissões para o diretório www são www-data: www-data.
Mark Ingram
OK, algumas coisas que qualquer arquivo que precise controlar os pinos GPIO precisarão ser executadas como raiz (o que abrirá uma brecha na segurança quando feito pela Web). Dito isto, você terá mais facilidade na depuração de problemas se conseguir que o script funcione na linha de comando antes de tentar fazer com que o lighttpd e o CGI sejam executados como raiz. Para instalar o módulo RPi.GPIO, siga estas instruções learn.adafruit.com/… . Você tem alguma experiência em eletrônica? O que você faria com os pinos do GPIO #
Steve Robillard
1
Ah, eu acabei de testar isso, e um script simples de import RPi.GPIO as GPIOrealmente requer privilégios de root! Agora eu acho que preciso que o lighttpd funcione como root (é apenas um projeto doméstico).
Mark Ingram
1
veja isto como uma opção para executar como root stackoverflow.com/questions/89228/...
Steve Robillard

Respostas:

6

Você pode tentar adicionar antes de 'import RPi.GPIO':

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

Pode ajudar a diagnosticar um erro.

E adicione estas linhas antes da sua saída html:

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

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

okertanov
fonte
6

Depois de seguir o conselho de okertanov, descobri que você não pode realmente usar RPi.GPIOum script CGI python, pois requer acesso root. Eu resolvi o problema chamando o gpioaplicativo de linha de comando incluído como parte do WiringPi , que pode ser chamado de uma conta não raiz.

# 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
fonte
0

# significa um comentário em Python

Apenas use

import RPi.GPIO as GPIO

Agora você precisará resolver o problema de permissões

John La Rooy
fonte
Desculpe o erro, copiei meu código que tinha essa linha comentada. Eu o removi da pergunta original.
Mark Ingram
0

Este tutorial recomenda a criação de uma cópia especial do Python e a concessão de privilégios de usuário root, assim:

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

E então, para criar seu CGI, acesse sudo nano /etc/lighttpd/lighttpd.confe encontre onde você está direcionando os .pyarquivos e mude /usr/bin/python/para o novo /usr/bin/pythonRoot/

Seph Reed
fonte