1,书写python文件

如在e:/workSpace/python/中新建python文件 test.py,文件内容如下:

  1. print("hello world!");

2,python文件的执行命令

  1. python E:/workSpace/python/test.py

3,php中exec()函数

  1. function exec(string $command,array[optional] $output,int[optional] $return_value)

知识点:
exec 执行系统外部命令时不会输出结果,而是返回结果的最后一行,如果你想得到结果你可以使用第二个参数,让其输出到指定的数组,此数组一个记录代表输出的一行,即如果输出结果有20行,则这个数组就有20条记录,所以如果你需要反复输出调用不同系统外部命令的结果,你最好在输出每一条系统外部命令结果时清空这个数组,以防混乱。第三个参数用来取得命令执行的状态码,通常执行成功都是返回0。

  1. $path = "E:/workSpace/python/test.py";
  2. $command = "python ".$path;
  3. exec($command,$output,$status);
  4. print_r($output);

4,遇到问题

按道理,按上面的语句,返回的$output数组中会有python文件的返回值”hello world!”的,但我这边打死都不出来,$status的值也是1,意味着该exec语句执行失败
php运行python脚本及相关问题处理 - 图1
这个就很奇怪了,我用cmd命令执行没问题,给同事执行也没问题
后来我换了下命令

  1. header("Content-type:text/html;charset=gbk");
  2. $command = "dir";
  3. exec($command,$output,$status);
  4. var_dump($output);
  5. var_dump($status);

结果出来是没问题的
php运行python脚本及相关问题处理 - 图2
那问题就出在exec()执行python命令上了

5,PHP的exec()调试方法

使用xdebug调试,没有用
查找资料发现了个解决办法:https://blog.csdn.net/dezhihuang/article/details/53690023
以上代码改写如下:

  1. //为方便,此处我已把test.py放到该php文件同级目录下,且test.py中的输出语句也是个长字符串
  2. exec("python test.py 2>error.txt", $array, $ret);
  3. //这样可以把运行exec的错误信息放到error.txt文件中,方便用户查错

在bash中0,1,2三个数字分代表STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,即标准输入(一般是键盘),标准输出(一般是显示屏,准确的说是用户终端控制台),标准错误(出错信息输出)。
也可以通过以下方式将标准错误重定向到标准输出保存到$array中:

  1. exec("python test.py 2>error.txt 2>&1", $array, $ret);
  2. //将错误信息放到$array中,可直接打印输出,方便查错

然后我改写语句后,顺利得到错误信息,如下
php运行python脚本及相关问题处理 - 图3

WTF!!!这错误提示真谜啊,我python环境变量没问题,直接cmd中运行python语句也ok,但为什么使用php exec()来执行python语句时会报此错误???

6,解决办法1

受这篇文章https://blog.csdn.net/zhou_xinke/article/details/70133702启发,我改成如下的语句
command命令中直接用python.exe文件执行

  1. $path = "test.py";
  2. $command = "C:/Users/lwpc/AppData/Local/Programs/Python/Python36-32/python.exe ".$path." 2>error.txt";
  3. //$command = "dir";
  4. exec($command,$output,$status);
  5. var_dump($output);
  6. var_dump($status);

然后终于出结果了
php运行python脚本及相关问题处理 - 图4
感动死了,但为什么这样就能出结果呢??
我发现我这python.exe是装在该用户文件夹users中的,会不会是权限问题??
当然,既然报python不是命令的错误,我还是去看下环境变量有没有问题吧。
结果发现python是放在用户变量中的,会不会是因为放在用户变量中,所以执行失败呢。然后我换成系统变量,还是没用。
我猜想,可能还是因为python安装在了用户文件中导致权限不够吧。

有没有知道什么原因的大神,麻烦留言告知一下。多谢!!!