不能在PHP中输出Python Print


Can't output Python Print in PHP

我真的被这个卡住了,但我是一个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命令行与浏览器不同?

  1. 如何让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以我的身份运行不是很好,但至少我可以证明问题出在特定模块的权限上!