arm*_*ani 7 php nginx raspberry-pi
建立:
我的Python脚本"lights.py"非常酷,因为它通过连接到Arduino Uno [然后通过USB连接到Pi]的继电器打开/关闭我客厅的灯光.我知道我可以使用Pi的GPIO引脚,但我没有.无论如何,这无关紧要.
我希望能够通过我的Pi托管的网站从Web浏览器激活脚本,所以我的/var/wwww/test/lights.php包含以下代码:
<?php
exec('python lights.py');
?>
Run Code Online (Sandbox Code Playgroud)
简单,不是吗?好吧,当我在浏览器中浏览该页面时,没有任何显示(预期),但灯光不会改变状态(意外). 但是,在命令行,以用户Pi身份登录,我可以运行"php /var/wwww/test/lights.php",它运行正常!
我想这是因为nginx似乎使用这个名为www-data的用户来做东西,所以也许它的权限问题呢?现在我正在为我徘徊在未知领域...我尝试了"su - www-data",看看我是否可以尝试使用该用户的脚本,但它要求输入密码,我从未设置过(并且空白密码不起作用).
非常感谢任何帮助.
更新 - 这是"ls -la/var/www/test/lights*"
-rw-r--r-- 1 www-data root 37 Feb 1 23:56 /var/www/test/lights.php
-rwxr-xr-x 1 www-data root 129 Feb 1 23:51 /var/www/test/lights.py
Run Code Online (Sandbox Code Playgroud)
第二次更新 - 检查:
pi@raspberrypi ~ $ sudo su - www-data
$ pwd
/var/www
$ php ./test/lights.php
python: can't open file 'lights.py': [Errno 2] No such file or directory
$ python ./test/lights.py
Traceback (most recent call last):
File "./test/lights.py", line 4, in <module>
ser = serial.Serial('/dev/ttyACM0', 9600)
File "/usr/local/lib/python2.7/dist-packages/serial/serialutil.py", line 260, in __init__
self.open()
File "/usr/local/lib/python2.7/dist-packages/serial/serialposix.py", line 276, in open
raise SerialException("could not open port %s: %s" % (self._port, msg))
serial.serialutil.SerialException: could not open port /dev/ttyACM0: [Errno 13] Permission denied: '/dev/ttyACM0'
Run Code Online (Sandbox Code Playgroud)
'/ dev/ttyACM0'设备是我的Arduino连接,因此看起来用户"www-data"无权运行该Python脚本,因为它无法输出到该文件.我可以"chmod"那个设备吗?
第三次更新 - 我觉得我们快要结束了!
使用"ls -g/dev/ttyACM0"我发现它由"拨出"组拥有.使用"grep dialout/etc/group"我发现只分配了用户"Pi".因此,我使用"usermod -a -G dialout www-data"向该组添加了www-data
现在,检查一下:
pi@raspberrypi ~ $ sudo su - www-data
$ cd test
$ php lights.php
$ python lights.py
$
Run Code Online (Sandbox Code Playgroud)
PHP和Python脚本都可以正常工作,灯光也会打开和关闭! 但是从浏览器加载网页"lights.php"仍然没有做任何事情!
第四次更新 我将PHP文件更改为:
<?php
exec('python lights.py', $output, $return);
print "Output:";
print $output;
print "<br />";
print "Return:";
print $return;
?>
Run Code Online (Sandbox Code Playgroud)
从我收集的内容来看,这是从exec()语句中获取调试信息的正确方法.这是刷新网页时的输出:
Output:Array
Return:1
Run Code Online (Sandbox Code Playgroud)
这对我有帮助吗?
给出的答案都没有帮助我......事实上,我对帖子的更新记录了最终的答案,这是我通过自己的试验/错误和谷歌搜索找到的。
我需要将用户 www-data 分配到 dialout 组中才能访问 /dev/ACM0,并且需要重新启动(整个服务器,而不仅仅是 nginx 出于某种原因)。
我不知道为什么每个人都一直回答这是一个路径问题,当我一直说 Python 脚本从 shell 运行良好,而 PHP 文件从 PHP-CLI 运行良好时。
不管怎样,最后就是这样解决的。感谢大家的尝试。
| 归档时间: |
|
| 查看次数: |
4074 次 |
| 最近记录: |