Как правильно вызвать клиент Python Pyro с помощью веб-сервера PHP и Apache?

У меня есть клиентское приложение сервера Python3 Pyro4, которое отлично работает при запуске из командной строки.

server.py

import Pyro4

@Pyro4.expose
class JokeGen(object):
    def __init__(self):
        self.jokevar = "Joke"

    def joke(self, name):
        return "Sorry "+name+", I don't know any jokes."

def main():
    Pyro4.Daemon.serveSimple(
            {
                JokeGen: "example.jokegen"
            },
            ns = True)

if __name__=="__main__":
    main()

client.py

#!/usr/bin/env python3
import Pyro4
import sys

person_to_joke = sys.argv[1]

joke_control = Pyro4.Proxy("PYRONAME:example.jokegen")

print (joke_control.joke(person_to_joke))

Проблема в том, что мне нужно запустить клиент из веб-приложения с помощью PHP.
Я создал файл joke.php.

<?php
$command = escapeshellcmd('/full/path/to/client.py SquirrelMaster');
$output = shell_exec($command);
echo $output;
?>

Хотя этот код действительно работает, я сделал несколько нестандартных хаков, чтобы заставить его работать. Я взял копию моего /home/user/.local (куда были установлены модули pyro4 для пользователя) и поместил ее в /var/www/ и передал права собственности к www-данным.

sudo chown -R www-data.www-data /var/www/.local

Похоже, должен быть лучший способ сделать это, и я почти уверен, что в будущем могут возникнуть проблемы, если я оставлю все так. Проблема заключается в том, что модули Pyro4 должны быть доступны для пользователя www-data. Итак, мой вопрос: как правильно сделать модули Pyro4 доступными для пользователя www-data в Ubuntu linux под управлением apache2?

ИЗМЕНИТЬ – ДОБАВИТЬ

Я также пытался сделать следующее:

sudo mkdir /var/www/.local
sudo mkdir /var/www/.cache
sudo chown www-data.www-data /var/www/.local
sudo chown www-data.www-data /var/www/.cache

Затем выполните команду:

sudo -H -u www-data pip3 install pyro4 --user www-data

Но это приводит к ошибке «Не удалось найти версию, удовлетворяющую требованию www-data (из версий:) Для www-данных не найдено подходящего дистрибутива»


person infinigrove    schedule 07.01.2017    source источник
comment
Ваш вопрос в последнем абзаце не соответствует заголовку. Что именно вы спрашиваете?   -  person Irmen de Jong    schedule 16.01.2017
comment
Мне нужно запустить скрипт Python, который использует модуль pyro4 из PHP. Сценарий PHP запускается пользователем веб-сервера Apache www-data. Проблема, с которой я столкнулся, заключается в том, чтобы сделать модули python pyro4 доступными для пользователя www-data. Заголовок — это краткая версия вопроса, а последний абзац — более длинная и подробная версия вопроса. Я обновил заголовок, чтобы он лучше соответствовал последнему абзацу. Надеюсь, это поможет, и спасибо, что посмотрели.   -  person infinigrove    schedule 16.01.2017
comment
что касается обновления с помощью команды pip: внимательно прочитайте синтаксис команды. Опция --user не принимает никаких аргументов.   -  person Irmen de Jong    schedule 19.01.2017
comment
Да, вы правы, спасибо. Я нашел другой способ установить модули pyro4 для пользователя www-data, но он также связан с потенциально опасным хакерством. Однако для меня это более приемлемое решение для того, что я пытаюсь сделать. Я планирую опубликовать этот ответ в ближайшее время.   -  person infinigrove    schedule 19.01.2017
comment
Надеюсь, вы рассмотрели предупреждение, объясненное в статье, на которую я дал ссылку ниже в ответе, superuser.com/questions/646062/, в котором утверждалось, что вы не должны предоставлять apache (пользователю www-data) полный доступ r/w к /var/www   -  person Irmen de Jong    schedule 19.01.2017
comment
ДА!! sudo -H -u www-data pip3 install pyro4 выполняет свою работу. Этот дополнительный --user www-data вызывал проблему. Я НЕ меняю разрешения для /var/www. Я создаю /var/www/.local и /var/www/.cache и даю разрешения www-data ТОЛЬКО для этих папок. Если вы хотите обновить свой ответ с помощью этого решения, я дам вам кредит за то, что вы нашли приемлемый ответ. Вы очень помогли! Благодарю вас!!!! :)   -  person infinigrove    schedule 19.01.2017


Ответы (1)


Немного похоже на этот вопрос https://superuser.com/questions/646062/granting-write-permissions-to-www-data-group

Я хотел предложить использовать переменную среды PYTHONPATH, чтобы указать на место установки библиотеки, доступное для чтения пользователю www-data, куда вы скопируете модули Python, к которым он должен получить доступ, но я думаю, что в настоящее время это считается дурным тоном.

Вероятно, лучше всего создать Python Virtualenv, доступный для www-data и установите в него все необходимые модули, используя команду pip из этого virtualenv. Возможно, вам придется использовать танец sudo/chown, чтобы сделать это правильно.

Другой способ, возможно, состоит в том, чтобы вообще не беспокоиться о вызове подпроцесса Python, а использовать HTTP-шлюз Pyro. Таким образом, вы можете просто сделать HTTP-запрос из PHP локально запущенному процессу HTTP-шлюза Pyro, который преобразует его в правильный вызов Pyro. Я не знаю PHP, но мне кажется, что должно быть легко сделать собственный http-запрос к серверу, работающему на каком-то локальном порту. Это также может быть быстрее, потому что вы не запускаете процессы python для каждого вызова.

(редактировать): другое успешно работающее решение выглядело следующим образом, где sudo используется для вызова pip под соответствующим пользователем, что позволяет ему установить библиотеку в папку библиотеки www-data .local:

  • создать папки /var/www/.local и /var/www/.cache, предоставив www-data разрешения только этим папкам (а не /var/www во избежание проблем с безопасностью)
  • вызывать sudo -H -u www-data pip3 install pyro4 Возможно, вам все равно придется добавить --user в команду pip, если это более старая версия, потому что я думаю, что только последние версии pip по умолчанию устанавливаются в папку lib пользователя, а не в папку lib глобальной системы python.
person Irmen de Jong    schedule 18.01.2017
comment
Я попытался запустить команду «pip install» от имени пользователя www-data и установить домашний каталог как /var/www, но это не удалось. Ошибку сейчас не вспомню. Я думал о том, чтобы попробовать еще раз и обновить свой вопрос, но еще не было возможности попробовать. Я кратко ознакомился с информацией и ссылками, которые вы разместили, и это может сработать для меня. Я попробую это завтра и дам вам знать. Спасибо! - person infinigrove; 18.01.2017
comment
Я только что обновил свой вопрос с помощью команды pip install, которая, хотя и должна работать, но не работает. Я стараюсь избегать Virtualenv, если это возможно, но могу пойти по этому пути. Кроме того, я просмотрел HTTP-шлюз Pyro, но он, похоже, плохо документирован и слишком убивает то, что я пытаюсь выполнить. Я уже использую Apache на своем сервере и предпочитаю не запускать другой HTTP-сервер. - person infinigrove; 18.01.2017
comment
HTTP-шлюз pyro работает через встроенный http-сервер и работает только локально. Но я могу понять ваши причины, по которым вам не нужно запускать слишком много разных вещей. - person Irmen de Jong; 19.01.2017
comment
JokeGen — это старый пример из старой версии Python и Pyro, который я модифицировал для работы с новой версией. Если бы был очень простой минимальный пример для пиро-http-шлюза с использованием JokeGen или подобного, я бы, вероятно, пошел по этому пути. Я парень LAMP и не очень хорошо кодирую Python. На самом деле я пытаюсь создать веб-интерфейс для github.com/infinigrove/TerminalRoastDB. - person infinigrove; 19.01.2017
comment
В исходном дистрибутиве Pyro4 есть пример http, который вы можете посмотреть рядом с (согласованной, довольно скудной) документацией. https://github.com/irmen/Pyro4/tree/master/examples/http - person Irmen de Jong; 19.01.2017
comment
Да, я пытался запустить этот пример, но даже не мог понять, как его запустить. Пытался посмотреть на источник, но это выглядело как больше проблем, чем того, что я пытаюсь сделать. - person infinigrove; 19.01.2017
comment
Я сожалею об этом, я попытаюсь немного улучшить ситуацию для будущего выпуска Pyro. - person Irmen de Jong; 19.01.2017
comment
Это было бы здорово, спасибо! - person infinigrove; 19.01.2017