首页 > 解决方案 > 在 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;
?>

标签: pythonphp

解决方案


更新答案:

我已经复制了您的问题并通过对 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手册)

与运行此类相对较高级别的命令一样 - 要非常小心。


推荐阅读