Я использую Ubuntu 14.04 с локальной веб-страницей, работающей на Apache2. Я могу получить доступ к index.php через мой браузер, но я хочу, чтобы на этой странице отображался график, подготовленный в скрипте python с именем graph.py. graph.py будет выполняться полностью, когда я выполняю index.php из терминала, и он будет ЧАСТИЧНО выполняться, когда я получаю к нему доступ из браузера. Команды из 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
После поиска в Интернете ответов, этот пост наиболее похож на мою проблему:
Почему PHP не может выполнить команду из веб-браузера?
Как предлагается в ответах, имеет смысл, что я могу иметь дело с проблемой разрешений. Я использовал «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 в CGI. Нет проблем. http://wiki.scipy.org/Cookbook/Matplotlib/Using_MatPlotLib_in_a_CGI_script
PHP
<?php
header('Location: cgi-bin/graph.py');
?>
ПИТОН
#!/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);
?>
ПИТОН
#!/usr/bin/python
import matplotlib
matplotlib.use( 'Agg' )
import pylab
pylab.plot([1,2,3])
pylab.savefig('img.png')
КАК вы видите разницу
matplotlib.use( 'Agg' )
Я понятия не имею, что это значит. Может быть, что-то важное. Без этой опции скрипт не запускается.
Насколько я понимаю, вам нужно будет настроить ваш веб-сервер для работы с компилятором Python. Любой веб-сервер по умолчанию не сможет использовать какой-либо компилятор, установленный в вашей системе. Ваш веб-сервер должен понимать для конкретного расширения файла, какую программу следует использовать для его запуска.
Ниже ссылка, где вы можете найти информацию для этого здесь:
[Как настроить скрипты Python для работы в Apache 2.0?
Но в вашем случае вам может понадобиться просто запустить скрипты Python из php. Вы можете найти информацию об этом здесь: Запуск скрипта Python из PHP
AFAIK, когда вы запускаете python из браузера, пользователь получает www-данные. Таким образом, вы должны изменить разрешения скрипта Python на + x. Вам не нужен CGI, если вы не запускаете PHP в CGI, что необычно. Просто поместите «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);
?>
Выход: