我真的坚持这个,但我是一个python(和Raspberry Pi)新手。我想要的是从我的python脚本输出print
输出。问题是(我相信)我的python脚本中的函数需要半秒钟才能执行,PHP错过了输出。
这是我的php脚本:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$cmd = escapeshellcmd('/var/www/html/weathertest.py');
$output = shell_exec($cmd);
echo $output;
//$handle = popen('/var/www/html/weathertest.py', 'r');
//$output = fread($handle, 1024);
//var_dump($output);
//pclose($handle);
//$cmd = "python /var/www/html/weathertest.py";
//$var1 = system($cmd);
//echo $var1;
echo 'end';
?>
我已经包含了评论块,以显示我尝试过的其他内容。所有三个输出“静态文本结束”
这是python脚本:
#!/usr/bin/env python
import sys
import Adafruit_DHT
import time
print 'static text '
humidity, temperature = Adafruit_DHT.read(11, 4)
time.sleep(3)
print 'Temp: {0:0.1f}C Humidity: {1:0.1f}%'.format(temperature, humidity)
py在命令行上执行正常。我添加了3秒的延迟,使脚本感觉更长,我自己的测试。
鉴于我总是将static text
作为输出,我认为问题在于PHP没有等待Adafruit命令。但对我来说最重要的是,如果我在命令行执行PHP脚本,即php /var/www/html/test.php
,那么我的三次PHP尝试都能正常工作 - 然后我得到所需的输出:
static text
Temp: 23.0C Humidity 34.0%
end
所以我猜有两个问题:1。如何让PHP等待Python完成。 2.为什么PHP命令行与浏览器不同?
答案 0 :(得分:2)
这不是一个答案,但添加了信息以说明为什么Pedro Lobito是正确的。
我将我的Python脚本编辑为:
#!/usr/bin/env python
import sys
import Adafruit_DHT
import time
print 'static text '
# humidity, temperature = Adafruit_DHT.read(11, 4)
time.sleep(10)
# print 'Temp: {0:0.1f}C Humidity: {1:0.1f}%'.format(temperature, humidity)
print "waited 10 seconds"
您会注意到我只是将我的问题区域注释掉,将睡眠时间增加到10秒,然后在最后添加新的打印件。现在在浏览器中运行它需要一段时间 - 10秒 - 所以脚本正在等待完成。
我的问题现在是Adafruit_DHT.read
,所以我会分开调查。
编辑(几个小时后,心情清新):
我的问题不在于该模块或功能,我的问题是我安装的第三方模块(Adafruit_DHT)的权限。 Pedro对我关于浏览器中的php与命令行之间差异的问题的回答是关键。我认为apache是以root用户身份运行的,但在用sudo nano /etc/apache2/envvars
查看配置后,我看到它是www-data。我把它改成了我,我的脚本在浏览器中完美运行。显然,以我身份运行的apache并不是很好,但至少我可以证明问题是该特定模块的权限!
答案 1 :(得分:1)
- 如何让PHP等待Python完成
醇>
shell_exec
将等待命令完成
- 为什么PHP命令行与浏览器不同?
醇>
我最好的猜测是运行命令的用户的区别。在命令行上,脚本作为您登录的同一用户在&#34;浏览器&#34;上运行,可能与apache / nginx的用户相同,两种情况下的环境变量都不同。
在脚本之前添加python
,即:
$output = shell_exec("python /var/www/html/weathertest.py");
echo $output;
或者使用fullpath
到python二进制文件:
$output = shell_exec("/full/path/to/python /var/www/html/weathertest.py");
echo $output;
PS:要知道shell上的fullpath
使用which python
。