Как правилно да извикам 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-data“


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 user и инсталирайте всички необходими модули в него, като използвате командата pip от този virtualenv. Може да се наложи да използвате танц судо/чаун, за да постигнете това правилно.

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

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

  • създайте /var/www/.local и /var/www/.cache папки, давайки www-data разрешения само на тези папки (а не /var/www, за да избегнете проблеми със сигурността)
  • invoke 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-данни и зададох домашната директория като /var/www, но не успя. Сега не си спомням грешката. Мислех да опитам отново и да актуализирам въпроса си, но все още не съм имал възможност да опитам. Разгледах накратко информацията и връзките, които публикувахте, и това може да ми свърши работа. Ще опитам това утре и ще ви уведомя. Благодаря! - person infinigrove; 18.01.2017
comment
Току-що актуализирах въпроса си с командата pip install, която според мен трябваше да работи, но не го направи. Опитвам се да избягвам Virtualenv, ако е възможно, но може да тръгна по този път. Освен това разгледах HTTP шлюза на Pyro, но изглежда, че е зле документиран и преуморен за това, което се опитвам да постигна. Вече изпълнявам Apache на моя сървър и предпочитам да не стартирам друг HTTP сървър. - person infinigrove; 18.01.2017
comment
Pyro http шлюзът работи чрез вграден 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
Има http пример в разпространението на изходния код на Pyro4, който можете да разгледате до (съгласувано, доста оскъдно) документация. 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