lighttpd와 함께 파이썬 CGI 스크립트에 RPi.GPIO를 포함시키는 방법은 무엇입니까?


13

최근에 CGI를 통해 lighttpd와 작동하도록 파이썬을 설정했습니다 ( 여기 참조 ). 그러나 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>"

왜 스크립트가 실행되지 않습니까? 권한 때문입니까? 분명히 라이브러리를 포함하여 특별한 권한이 필요하지 않습니까? 스크립트 또는 오류 로그에 오류 출력이없는 이유는 무엇입니까?


포함 된 파일 또는 파일 위치에 대한 다음 권한 / 소유 중 하나 또는 둘 다일 수 있습니다. 문제점을 정정하려면 포함 된 파일을 실행하려는 파일과 동일한 디렉토리로 이동하고 실행중인 스크립트와 동일한 사용자가 소유하고 있는지 확인하십시오. 그래도 문제가 해결되면 Google에 알려 주시면 권한 / 소유권 설정 및 포함 검색 경로 설정에 대한 추가 안내를 받으실 수 있습니다.
스티브로 빌라 드

저는 파이썬 초보자입니다 .RPi.GPIO는 실제 파일입니까? \ cgi-bin \ gpio.py는 pi : pi의 소유이며 www 디렉토리에 대한 권한은 www-data : www-data입니다.
Mark Ingram

좋아, GPIO 핀을 제어하는 ​​데 필요한 모든 파일은 루트로 실행해야합니다 (웹을 통해 완료되면 보안 구멍이 열림). lighttpd 및 CGI를 루트로 실행하려고 시도하기 전에 명령 행에서 스크립트가 작동하게되면 문제점을 디버깅하기가 더 쉬워 진다고 말했습니다. 설치하려면 RPi.GPIO 모듈은이 지침에 따라 learn.adafruit.com/... . 전자 경험이 있습니까? GPIO 핀으로 무엇을하려고하십니까
Steve Robillard

1
아, 방금 이것을 테스트했으며 간단한 스크립트 import RPi.GPIO as GPIO에는 실제로 루트 권한이 필요합니다! 이제 루트로 실행하려면 lighttpd를 가져와야한다고 생각합니다 (단지 홈 프로젝트 일뿐입니다).
Mark Ingram

1
루트로 실행에 옵션으로이 체크 아웃 stackoverflow.com/questions/89228/...
스티브 Robillard에게

답변:


6

'import 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루트 C 액세스가 필요하므로 실제로 파이썬 CGI 스크립트에서 사용할 수 없다는 것을 알았 습니다. WiringPi의gpio 일부로 포함 된 명령 줄 앱을 호출하여 문제를 해결했습니다. 이는 루트가 아닌 계정에서 호출 할 수 있습니다.

# 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

# 파이썬에서 주석을 의미

그냥 사용

import RPi.GPIO as GPIO

이제 권한 문제를 해결해야합니다


죄송합니다. 실수로 해당 줄이 주석 처리 된 코드를 복사했습니다. 원래 질문에서 삭제했습니다.
Mark Ingram

0

이 튜토리얼 에서는 다음과 같이 특수한 Python 복사본을 만들어 루트 사용자 권한을 부여하는 것이 좋습니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.