从Web服务器运行系统调用

时间:2013-10-12 08:03:45

标签: python raspberry-pi lighttpd

我正在尝试从cgi python脚本运行标准的python os.system调用。 这是教程的一部分,因此脚本非常简单。我正在尝试使用Raspberry Pi相机拍照并将其显示在网页中。

import os, sys

os.system('raspistill -o /var/www/images/image.jpg')

print "Content-type:text/html\r\n\r\n"
print '<html>'
print '<head>'
print '<title>Hello Word - First CGI Program</title>'
print '</head>'
print '<body>'
print '<h2>Hello Word! This is my first CGI program</h2>'
print '<img src="/var/www/images/image.jpg"/>'
print '</body>'
print '</html>'

运行系统命令(在浏览器中打开)时出现的错误是:
    *未能打开vchiq实例“

我已经看到了另一个问题,它说了一些关于http deamon作为错误用户运行的事情,但我不确定这是什么意思。 当我以标准用户身份运行脚本时,脚本运行正常。

2 个答案:

答案 0 :(得分:1)

我修好了。

Web服务器可以访问raspistill命令,但该命令使用了它无权访问的视频设备。我将www-data用户添加到视频和音频组中,这样我就可以播放音频和拍照。我还必须为我的web目录中的某些文件夹更改一些组。 我必须解决的最后一件事是os.system()调用返回了一些内容,这给浏览器显示了一些显示网页的问题。它只显示文字。我现在使用子进程模块,初始代码似乎工作。我的简单测试代码在这里:

import os, sys

import subprocess

#output = subprocess.check_output("raspistill -o /var/www/images/image.jpg",     shell=True)
#os.system('raspistill -v -o /var/www/images/image.jpg')

# Import modules for CGI handling
import cgi, cgitb

# Create instance of FieldStorage
form = cgi.FieldStorage()

output = ""
output2 = ""
# Get data from fields
if form.getvalue('speak_en'):
   output = subprocess.check_output("espeak \"%s\"" % (form.getvalue('speak')), shell=True)

if form.getvalue('picture'):
   output2 = subprocess.check_output("raspistill -o /var/www/images/image.jpg", shell=True)


print """\
Content-type:text/html\n
<html>
<head>
<title>Hello Word - First CGI Program</title>
</head>
<body>
<h2>Select photo or speak</h2>
<form action=\"/cgi-bin/hello.py\" method=\"post\">
<input type=\"checkbox\" name=\"speak_en\" value=\"on\" />
Speak: <input type=\"text\" name=\"speak\"><br />
Take picture:
<input type=\"checkbox\" name=\"picture\" value=\"on\" />
<br />
<input type=\"submit\" value=\"Submit\" />
</form>
<img src=\"../images/image.jpg\" width=640 height=480>
<p>Speak output: %s</p>
<p>Picture output: %s</p>
</body>
</html>
""" % (output, output2)

答案 1 :(得分:0)

大多数Web服务器都与Web服务器的用户一起运行。例如,Apache2以www-data的形式运行。 计算机中的所有文件都具有允许或禁止来自不同用户的某些操作的所有权和权限数据 - 例如,只有超级用户(root)才能运行poweroff应用程序来关闭计算机。

您应该做的是找到您尝试运行的可执行文件which raspistill。这将返回可执行文件的位置。接下来,您应该使用ls -l `which raspistill`检查文件权限,并查看显示为-rwxr-xr--的所有者数据和文件权限(这是一个通用权限集,您的权限可能会有所不同)。第3个表示文件所有者的读写 - 执行权限,接下来的3个字符仅表示用户组的读取和执行权限,后3个字符仅表示“其他”用户的读取权限。

如果文件的所有者不是www-data,您可以做几件事,例如使用我不建议的chown <user> <file>更改文件的所有权信息,或者向“其他”用户添加执行权限设置为chmod o+x `which raspistill`

如果问题确实存在于权限中 - 这应该可以解决您的问题。

其他信息:

http://www.computerhope.com/unix/uchmod.htm

http://www.ss64.com/bash/chmod.html