0

我正在尝试从 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 守护程序以错误的用户身份运行,但我不确定这意味着什么。当我以标准用户身份运行脚本时,脚本运行良好。

4

2 回答 2

1

我修好了它。

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

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)
于 2013-10-12T16:55:54.350 回答
1

大多数 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

于 2013-10-12T09:23:12.437 回答