我已经被困了几天了。我正在尝试从PHP调用一个简单的python脚本。就我而言,我无法弄清楚问题出在哪里。我已经用chmod+x使onoff.py脚本可执行。
我可以从命令行运行脚本,如下所示:
pi@raspberrypi:/var/www/html $ python onoff.py
LED on
LED off
我的问题是当我尝试从PHP调用脚本时。我一无所获。
我的Python脚本:
#!/usr/bin/python
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(18,GPIO.OUT)
print "LED on"
GPIO.output(18,GPIO.HIGH)
time.sleep(1)
print "LED off"
GPIO.output(18,GPIO.LOW)
我的PHP脚本:
<?php
$command = escapeshellcmd('python /var/www/html/onoff.py');
$output = shell_exec($command);
echo $output;
?>
非常感谢您的帮助!
编辑:
如果我将onoff.py脚本更改为一个简单的while循环,例如:
#!/usr/bin/python
x=1
while (x<10):
print x
x=x+1
浏览器上的输出为:
1 2 3 4 5 6 7 8 9
我只是不明白为什么循环会运行,但我没有得到原始python代码的输出。
编辑2:
好的,所以我采取了一种不同的方法,试图看看代码在哪里失败。我一次添加一些代码。请参阅以下内容。
#!/usr/bin/python
import random
import time
import RPi.GPIO as GPIO
randomNumber = random.randint(1, 20)
GPIO.setmode(GPIO.BCM)
#GPIO.setup(18,GPIO.OUT)
print randomNumber
现在,当我运行PHP时,它会显示一个随机数,这样我就知道python脚本正在运行。当我取消注释GPIO.setup(18,GPIO.OUT)并运行php时,我会得到一个空白屏幕。我不知道为什么这会使脚本失败。
shell_exec()
仅在$command
a)时返回字符串。运行正常并假设b)。它吐出了对STDOUT的反应。
使用exec()
并将您的命令、一个整数$code
和一个空数组$response
传递给它,这两个数组都被PHP视为引用参数。
这样运行您的命令:
$command = escapeshellcmd('/path/to/python /var/www/html/onoff.py');
$response = array();
$code = 0;
exec($command, $response, $code);
var_dump($code, $response);
die;
现在,您应该了解PHP内部提供的实际上是什么,以及Python脚本不起作用的原因。
您需要在脚本之前使用python
,即:
$command = escapeshellcmd('python /var/www/html/onoff.py');
如果它不起作用,python可能不在apache
用户的PATH
上,您可能需要使用python
二进制文件的完整路径,使用which
查找完整路径:
which python
//usr/bin/python
使用该值:
$command = escapeshellcmd('/usr/bin/python /var/www/html/onoff.py');
注意:
- 确保apache
user
对onoff.py
具有执行权限