我最近设置了python,以通过CGI与lighttpd一起使用(请参见此处)。但是,在我加入RPi.GPIO的那一刻,脚本停止执行(我想是因为没有HTML输出),但是错误日志(/var/log/lighttpd/error.log)中没有错误输出。 .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引脚

啊,我已经测试过了,导入RPi.GPIO的简单脚本作为GPIO实际上确实需要root权限!现在我想我需要获得lighttpd才能以root用户身份运行(这只是一个家庭项目)。

将此选项作为以root用户身份运行的选项stackoverflow.com/questions/89228/…

#1 楼

您可以尝试在“导入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

#2 楼

遵循okertanov的建议后,我发现您实际上无法在python CGI脚本中使用RPi.GPIO,因为它需要root访问权限。我通过调出WiringPi附带的gpio命令行应用程序来解决此问题,可以从非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


#3 楼

#表示在Python中的注释

只需使用

import RPi.GPIO as GPIO


现在您需要解决权限问题

评论


抱歉,这是我的错误,我复制了代码,并将该行注释掉。我已将其从原始问题中删除。

–马克·英格拉姆
2012年8月3日在8:49

#4 楼

本教程建议创建一个特殊的Python副本并为其授予root用户特权,如下所示:

是您要从中定向sudo nano /etc/lighttpd/lighttpd.conf文件并将.py更改为新的/usr/bin/python/ /