Измените разрешения, чтобы PHP-скрипт в браузере мог выполнять операции matplotlib в Python-скрипте.

Я использую 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 не будет выполняться при доступе из браузера. У кого-нибудь есть идеи, что могло бы заразить это?

0

Решение

Я был в состоянии сделать сюжет с 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' )

Я понятия не имею, что это значит. Может быть, что-то важное. Без этой опции скрипт не запускается.

0

Другие решения

Насколько я понимаю, вам нужно будет настроить ваш веб-сервер для работы с компилятором Python. Любой веб-сервер по умолчанию не сможет использовать какой-либо компилятор, установленный в вашей системе. Ваш веб-сервер должен понимать для конкретного расширения файла, какую программу следует использовать для его запуска.
Ниже ссылка, где вы можете найти информацию для этого здесь:
[Как настроить скрипты Python для работы в Apache 2.0?

Но в вашем случае вам может понадобиться просто запустить скрипты Python из php. Вы можете найти информацию об этом здесь: Запуск скрипта Python из PHP

0

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);
?>

Выход:

IMG

0
По вопросам рекламы [email protected]