如何在带有lighttpd的python CGI脚本中包含RPi.GPIO?


13

我最近设置了python以通过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>"

为什么脚本不执行?是因为权限?当然,包括该库不应该要求任何特殊权限吗?为什么脚本或错误日志中没有任何错误输出?


这可能是所包含文件或文件位置的以下权限/所有权中的一个或两个。要解决此问题,请尝试将包含的文件移至与您尝试运行的文件相同的目录,并确保该文件与您运行的脚本属于同一用户。如果这解决了问题,请告诉我们,我们可以指导您进一步设置权限/所有权和设置包含搜索路径。
史蒂夫·罗比拉德

我是Python的新手,RPi.GPIO是实际文件吗(在哪里)?\ cgi-bin \ gpio.py由pi:pi拥有,并且www目录的权限为www-data:www-data。
Mark Ingram 2012年

好的,需要控制GPIO引脚的任何文件都需要以root用户身份运行(这将在通过Web完成操作时打开一个安全漏洞)。话虽如此,如果您在尝试让lighttpd和CGI以root用户身份运行之前从命令行运行脚本,则将可以更轻松地调试所有问题。要安装RPi.GPIO模块,请遵循以下指示:Learn.adafruit.com/…。您有电子经验吗?您打算使用GPIO引脚做什么
Steve Robillard 2012年

1
啊,我已经测试过了,一个简单的脚本import RPi.GPIO as GPIO确实需要root权限!现在我想我需要获得lighttpd以root身份运行(这只是一个家庭项目)。
马克·英格拉姆

1
检查了这一点作为一个选项,以root身份运行stackoverflow.com/questions/89228/...
史蒂夫罗比拉德

Answers:


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访问权限。我通过调出WiringPigpio附带的命令行应用程序来解决此问题,可以从非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/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.