我正在使用php 7和laravel 5.4,我正在尝试执行一些使用matplotlib来创建一些绘图的python脚本。
用例:
Python 脚本script.py
:
print("DONE")
命令行输出:
d:workspace>python sample.py
DONE
创建一个小的 php 文件test.php
:
<?php
exec('sample.py', $output);
print_r($output);
?>
将输出:
d:workspace>php test.php
Array
(
[0] => DONE
)
从 laravel 控制器方法做同样的事情:
public function show_with_file($id, $file)
{
...
// Execute python script to retrieve dot-plot
$command = escapeshellcmd('d:\workspace\sample.py');
exec($command, $output);
dd($output);
...
}
将转储输出:
array:1 [▼
0 => "DONE"
]
到目前为止,一切运行正常。但是,如果我们修改 python 脚本以包含 matplotlib 模块:
import matplotlib
print("DONE")
执行脚本将成功,在命令行中执行test.php
文件工作正常,但从Laravel控制器转储输出结果会得到:
[]
注意:
在不同的帖子上阅读了一些关于这个问题的信息,我将 matplot lib 的后端更改为 agg:
import matplotlib
matplotlib.use('agg')
print("DONE")
但没有任何变化:脚本通过python sample.py
在命令行中完美运行,结果通过执行php test.php
正确给出,但在Laravel控制器中仍然缺少结果。
我很困惑,因为这不是 php 问题,因为一个小的 php exec 脚本可以做得很好,但在 laravel 和 apache 下它没有,也不是文件权限问题,因为如果脚本不包含 matplotlib,它就可以工作。
有人知道我错过了什么吗?
你确定你的Python代码中没有错误吗?
也许PHP正在尝试在未安装matplotlib
的Python版本上运行您的代码?