1,书写python文件
如在e:/workSpace/python/中新建python文件 test.py,文件内容如下:
print("hello world!");
2,python文件的执行命令
python E:/workSpace/python/test.py
3,php中exec()函数
function exec(string $command,array[optional] $output,int[optional] $return_value)
知识点:
exec 执行系统外部命令时不会输出结果,而是返回结果的最后一行,如果你想得到结果你可以使用第二个参数,让其输出到指定的数组,此数组一个记录代表输出的一行,即如果输出结果有20行,则这个数组就有20条记录,所以如果你需要反复输出调用不同系统外部命令的结果,你最好在输出每一条系统外部命令结果时清空这个数组,以防混乱。第三个参数用来取得命令执行的状态码,通常执行成功都是返回0。
$path = "E:/workSpace/python/test.py";
$command = "python ".$path;
exec($command,$output,$status);
print_r($output);
4,遇到问题
按道理,按上面的语句,返回的$output数组中会有python文件的返回值”hello world!”的,但我这边打死都不出来,$status的值也是1,意味着该exec语句执行失败
这个就很奇怪了,我用cmd命令执行没问题,给同事执行也没问题
后来我换了下命令
header("Content-type:text/html;charset=gbk");
$command = "dir";
exec($command,$output,$status);
var_dump($output);
var_dump($status);
结果出来是没问题的
那问题就出在exec()执行python命令上了
5,PHP的exec()调试方法
使用xdebug调试,没有用
查找资料发现了个解决办法:https://blog.csdn.net/dezhihuang/article/details/53690023
以上代码改写如下:
//为方便,此处我已把test.py放到该php文件同级目录下,且test.py中的输出语句也是个长字符串
exec("python test.py 2>error.txt", $array, $ret);
//这样可以把运行exec的错误信息放到error.txt文件中,方便用户查错
在bash中0,1,2三个数字分代表STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,即标准输入(一般是键盘),标准输出(一般是显示屏,准确的说是用户终端控制台),标准错误(出错信息输出)。
也可以通过以下方式将标准错误重定向到标准输出保存到$array中:
exec("python test.py 2>error.txt 2>&1", $array, $ret);
//将错误信息放到$array中,可直接打印输出,方便查错
然后我改写语句后,顺利得到错误信息,如下
WTF!!!这错误提示真谜啊,我python环境变量没问题,直接cmd中运行python语句也ok,但为什么使用php exec()来执行python语句时会报此错误???
6,解决办法1
受这篇文章https://blog.csdn.net/zhou_xinke/article/details/70133702启发,我改成如下的语句
command命令中直接用python.exe文件执行
$path = "test.py";
$command = "C:/Users/lwpc/AppData/Local/Programs/Python/Python36-32/python.exe ".$path." 2>error.txt";
//$command = "dir";
exec($command,$output,$status);
var_dump($output);
var_dump($status);
然后终于出结果了
感动死了,但为什么这样就能出结果呢??
我发现我这python.exe是装在该用户文件夹users中的,会不会是权限问题??
当然,既然报python不是命令的错误,我还是去看下环境变量有没有问题吧。
结果发现python是放在用户变量中的,会不会是因为放在用户变量中,所以执行失败呢。然后我换成系统变量,还是没用。
我猜想,可能还是因为python安装在了用户文件中导致权限不够吧。