我正在运行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
在网上搜索答案后,这篇文章似乎与我的问题最相似:
Why cannot PHP execute a command from web browser?
正如回复中所建议的那样,我可能正在处理权限问题。我用了#34; updatedb&#34;和&#34;找到pyplot&#34;找到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目录中有其他依赖项,因此我使用&#34; chmod 777为这两个目录中的每个文件设置权限。&#34;我知道一旦我找到可以缩放权限的地方,我将不得不恢复这些,但是即使允许这种访问级别,从浏览器访问时也不会执行php文件。有没有人有什么想法可以抓住这个?
答案 0 :(得分:0)
根据我的理解,您需要配置您的Web服务器以使用python编译器。默认情况下,任何Web服务器都将无法使用系统上安装的任何编译器。您的网络服务器应该了解特定文件扩展名应该使用哪个程序来运行它。 以下是您可以在此处找到相关信息的链接: [How do you set up Python scripts to work in Apache 2.0?
但在你的情况下你可能只需要从php运行python脚本。您可以在此处找到相关信息:Running a Python script from PHP
答案 1 :(得分:0)
AFAIK,当您从浏览器执行python时,用户是www-data。因此,您应该将python脚本的权限更改为+ x。你不需要cgi,除非你在cgi中运行PHP是不寻常的。只需把'graph.py&#39;进入保存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);
?>
输出:
答案 2 :(得分:0)
我能够在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 [&#39; HOME&#39; ] =&#39; / tmp /&#39;。
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' )
我不知道这意味着什么。也许是重要的事情。没有这个选择,脚本就不会运行。