在 PHP 脚本中运行 python 脚本

时间:2021-02-02 12:11:53

标签: python php

我正在尝试在 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;
?>

1 个答案:

答案 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 在这里优先于 execshell_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 手册)

像往常一样运行这些相对高级的命令 - 要非常小心。