我真的被这个卡住了,但我是一个python(和Raspberry Pi)新手。我只想从python脚本输出print
的输出。问题是(我相信)我的python脚本中的一个函数需要半秒钟来执行,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命令行与浏览器不同?
- 如何让PHP等待Python完成
shell_exec
将等待命令完成
- 为什么PHP命令行与浏览器不同?
我最好的猜测是运行命令的用户的差异。在命令行中,脚本以您登录的同一用户运行,在"浏览器"上,可能是与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:要了解fullpath
,请使用shell上的which python
这不是一个答案,而是添加了信息来说明为什么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是作为根运行的,但在查看了sudo nano /etc/apache2/envvars
的配置后,我看到它是www-data。我把它改成了我,我的脚本在浏览器中运行得很好。显然,apache以我的身份运行不是很好,但至少我可以证明问题出在特定模块的权限上!