我正在尝试在 php 脚本中运行 python 脚本,我的 python 文件创建了一个图,我希望该图显示在 php 页面中。 但是当我运行代码时它不显示任何东西..有人知道为什么吗?请如何解决这个问题? Python代码:
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4])
plt.ylabel('some numbers')
PHP 脚本
<?php
$command = escapeshellcmd('python test.py');
$output = shell_exec($command);
echo $output;
?>
答案 0 :(得分:1)
更新答案:
我已经复制了您的问题,并通过对 PHP 和 Python 文件进行了一些更改来解决。
试试这些修改:
test.py:
#!/usr/bin/python -u
import matplotlib.pyplot as plt
import sys
plt.plot([1, 2, 3, 4])
plt.ylabel('some numbers')
plt.savefig(sys.stdout)
在顶部添加环境注释,确保从 PHP 调用时,python 在正确的环境中运行。
底线确保python将生成的图像输出到标准输出,以便PHP可以接收它。
PHP 文件:
<?php
// use output buffering to prevent passthru outputting the returned image code immediately.
ob_start();
passthru('python test.py');
// Store the binary image data (png format) to $raw variable
$raw = ob_get_contents();
ob_end_clean();
?>
<!-- output the image by base64_encoding it -->
<!-- could also look at using GD to store the image to a file on the webserver for direct access in HTML -->
<img src="data:image/png;base64, <?=base64_encode($raw)?>" alt="image" />
这两个文件应该会导致 PHP 运行 python 命令,将返回的二进制图像存储到 $raw
变量并使用输出缓冲来防止 passthru
自动将输出转储到浏览器。
Passthru
在这里优先于 exec
或 shell_exec
使用,因为它处理正确运行的命令的二进制输出(exec
将返回的图像二进制拆分为各种数组元素并不总是很容易重新组装。
以下原始答案用于解释评论。
使用 shell_exec
时,您必须将命令与 echo 语句链接起来才能获得结果。例如。类似:
shell_exec("python test.py 2>&1; echo $?");
考虑改用 exec($command, $output)
- 记下 exec
的参数以确保返回输出值。还有可选的第三个参数,可让您检查任何结果代码。 (参见:https://www.php.net/manual/en/function.exec.php 手册)
像往常一样运行这些相对高级的命令 - 要非常小心。