更改权限以允许浏览器中的 PHP 脚本在 python 脚本中执行 matplotlib 操作

Change permissions to allow PHP script in browser to execute matplotlib operations in a python script

我是 运行 Ubuntu 14.04,在 Apache2 上有一个本地托管的网页 运行。我可以通过浏览器正常访问 index.php,但我希望该页面显示一个在名为 graph.py 的 python 脚本中准备的图表。当我从终端执行 index.php 时,graph.py 将完全执行,而当我从浏览器访问它时,它将部分执行。来自 pyplot 的命令,在 graph.py 文件中使用,当从浏览器调用时将不会执行。

我已经简化了这个问题的文件内容。

index.php 的内容:

<?php
echo exec('whoami');
echo "</br>";
$r = `python graph.py`;
echo($r);
?>

graph.py 的内容:

#!/usr/bin/python2.7

import cgi
import matplotlib.pyplot as plt

print("Initial file parsing successful")

plt.plot([1,2,3,4])

print("File completed operation using pyplot")

终端 index.php 的输出符合我的预期:

MYUSERNAME</br>Initial file parsing successful
File completed operation using pyplot

浏览器从未完成 PyPlot 操作,如其输出所示:

www-data
Initial file parsing successful 

在互联网上搜索答案后,这个 post 似乎与我的问题最相似:

Why cannot PHP execute a command from web browser?

如回复中所述,我可能正在处理权限问题,这是有道理的。我使用 "updatedb" 和 "locate pyplot" 来查找 pyplot 模块出现的每个实例。在我的机器上,两个目录中有三个文件:

/usr/lib/pymodules/python2.7/matplotlib/pyplot.py
/usr/lib/pymodules/python2.7/matplotlib/pyplot.pyc
/usr/share/pyshared/matplotlib/pyplot.py

由于 pyplot 在 matplotlib 目录中有其他依赖项,我使用 "chmod 777." 为这两个目录中的每个文件设置权限我知道一旦找到可以缩放的位置,出于安全原因我将不得不恢复这些文件权限,但即使允许该级别的访问,php 文件在从浏览器访问时也不会执行。有谁知道是什么感染了这个?

据我了解,您需要配置网络服务器以使用 python 编译器。默认情况下,任何 Web 服务器都将无法使用系统上安装的任何编译器。您的网络服务器应该了解特定文件扩展名应该使用哪个程序 运行 它。 下面是 link,您可以在此处找到相关信息: [How do you set up Python scripts to work in Apache 2.0?

但在您的情况下,您可能只需要 运行 python 来自 php 的脚本。您可以在这里找到相关信息:Running a Python script from PHP

AFAIK,当您从浏览器执行 python 时,用户是 www-data。因此,您应该将 python 脚本的权限更改为 a+x。你不需要cgi,除非你在不寻常的cgi中运行 PHP。只需将 'graph.py' 放入与 index.php 相同的文件夹中。将您的绘图保存到图像中,然后通过 PHP 在浏览器中打开它。就是这样。

Python 脚本

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.savefig('img.png')

PHP代码

<?php
$r = '/usr/bin/python ./graph.py';
exec($r);

$im = imagecreatefrompng("img.png");
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
?>

输出:

我能够在 cgi 中使用 Python 绘制绘图。没问题。 http://wiki.scipy.org/Cookbook/Matplotlib/Using_MatPlotLib_in_a_CGI_script

PHP

<?php
header('Location: cgi-bin/graph.py'); 
?>

PYTHON

#!/usr/bin/python

import os,sys
import cgi
import cgitb; cgitb.enable()

os.environ[ 'HOME' ] = '/tmp/'

import matplotlib
matplotlib.use( 'Agg' )
import pylab
form = cgi.FieldStorage()
pylab.plot([1,2,3])

print "Content-Type: image/png\n"
pylab.savefig( sys.stdout, format='png')

这里是 没有 cgi。由于 PHP 几乎是可执行的,我们实际上并不需要 cgi。我将 graph.py 从 cgi-bin 移动到 html 文件夹并从中删除了所有 cgi 模块,甚至 os.environ[ 'HOME' ] = '/tmp/'.

PHP

<?php
$r = '/usr/bin/python ./graph.py';
exec($r);

$im = imagecreatefrompng("img.png");
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
?>

PYTHON

#!/usr/bin/python

import matplotlib
matplotlib.use( 'Agg' )
import pylab

pylab.plot([1,2,3])
pylab.savefig('img.png')

如您所见,区别在于

matplotlib.use( 'Agg' )

我不知道这是什么意思。重要的事情,也许。如果没有这个选项,脚本不会 运行.