Имам сървърно клиентско приложение на 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“
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