У меня есть клиентское приложение сервера 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-данных не найдено подходящего дистрибутива»
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