这个问题折腾了我四天的时间,每一天不断查阅资料,询问各路大佬,没有一个给出满意的答案,最后终于让我给整出来了。

我做的东西是首先点击一个PHP文件,然后PHP调用python文件,这个python的作用是点亮LED灯,搭载在树莓派上。

最开始的时候,我是用的PHP调用shell脚本,后来发现只有Python这句话不执行,就单独研究如何调用python。

首先我列一下失败的原因,有很多方面,下面我全面的总结一下:

以下原因挨个排查:


1.PHP调用python的函数有system,exec等,这个上网就可以查到,我用的是exec。首先新建一个php文件,内容如下:

<?php

         phpinfo();

?>

之后进入这个PHP文件,按ctrl+f,搜索exec是否在disable_function里面,当我搜索的时候,发现exec被禁用了,因为这是一个高危函数。你把它删除之后就可以了。然后重启php,直接重启树莓派或者电脑也可以,更方便。


2.查看php是否是安全模式,在php.ini里面,safe_mode看看是都开着,开着的话可以换成off。寻找php.ini可以用以下命令:

find / -name php.ini     默认安装的话一般都在/etc/php5里面


3.在命令里面加入nohup。例如

<?php

          exec("nohup python test.py");

?>

nohup具体的作用请百度。简单来说就是不断持续运行这条命令。


4.python使用绝对路径。上面的代码改成

<?php

        exec("nohup /usr/bin/python /home/pi/Desktop/test.py")

?>

第一个参数用which python查找,一般默认都是我上面写的。第二参数是你要运行的python的路径。


5.将php文件与py文件放在同一个目录下面。


6.对于python赋予权限。你要执行那个py文件,就对哪个文件赋予权限

chmod 777 test.py

chmod u+x test.py

chown www-data test.py

这三条都可以。


写到这里一般的python都可以运行了,你如果想看反馈的信息可以这么写

<?php

       $res = exec("nohup /usr/bin/python /home/pi/Desktop/test.py",$out1,$out2);

?>

输出的结果$out1是一个数组,存放的每一行运行的结果,第三个参数$out2如果是0,表示运行成功,如果是1,表示运行失败。


7.到这里时,我写了一单纯地输出字符串的python文件就可以正常运行了,但是我调用GPIO的控制LED的python却一直失败。这里的原因是你在运行的时候,需要sudo命令。但是PHP在运行的时候没有获得权限。所以最后的步骤是在语句上加上sudo

例如:  exec("sudo nohup /usr/bin/python /home/pi/Desktop/test.py");就可以了。


下面我贴一个我写好的代码给大家看看:

python文件:led灯的接口是12阳极14阴极

light.py:


#led  positive pole 12 negative pole 14
import RPi.GPIO as GPIO
import time
PIN_NO=12
GPIO.setmode(GPIO.BOARD)
GPIO.setup(PIN_NO, GPIO.OUT)
for x in xrange(5):
GPIO.output(PIN_NO,GPIO.HIGH)
time.sleep(2)
GPIO.cleanup()

light.php:

<?php
$res = exec("sudo nohup /usr/bin/python /var/www/html/light.py",$out1,$out2);
echo $out1;
echo $out2;
?>

按照我说的方法做之后,将两个文件放在同一目录下,点击light.php文件,led小灯就亮了!大功告成!


之后我问了群里的一些大神,其实控制LED完全可以调用PHP的GPIO库来实现,没有必要中间再加一个Python。这个日后我有时间研究了再发出来。



8.又重新做了一遍,发现exec执行的时候返回1,一直是错误,怎么也解决不了,在exec中加入exec("python python.py 2>error.txt 2&>1",$out1,$out2);

方便查看执行错误,以便查找错误。