python - 在 PHP 脚本中运行 python 脚本
问题描述
我正在尝试在 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;
?>
解决方案
更新答案:
我已经复制了您的问题并通过对 PHP 和 Python 文件的一些更改来解决。
试试这些修正:
测试.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将生成的图像输出到stdout,以便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 $?");
看看 using exec($command, $output)
- 记下参数 forexec
以确保返回输出值。还有可选的第三个参数,可以让您检查任何结果代码。(参见:https ://www.php.net/manual/en/function.exec.php手册)
与运行此类相对较高级别的命令一样 - 要非常小心。
推荐阅读
- r - 试图进行方差分析
- java - Graphics2D叠加图像+文字问题:文字错误
- r - 如何将相同的标签添加到R中的不同类别
- javascript - 欧元货币格式
- reactjs - 如何将 subColors 作为数据添加到我的 React 组件
- python - 如何处理混合数据类型
- azure - 在 oAuth 2.0 令牌中限定特定 Azure 存储库
- javascript - 如何让 webpack 将我的 assets/image/ 捆绑到组件中,尽管我从 url 调用它们
- java - Get a List hierarchy using java stream
- reactjs - 使用 react 显示 SVG 的特定元素