我有一个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从Web应用程序运行客户端。
我创建了一个joke.php
<?php
$command = escapeshellcmd('/full/path/to/client.py SquirrelMaster');
$output = shell_exec($command);
echo $output;
?>
尽管此代码确实有效,但我还是进行了一些非标准的编程以使其正常工作。我复制了/home/user/.local(已为用户安装了pyro4模块)的副本,并将其放在/ var / www /中,并赋予了www-data所有权。
sudo chown -R www-data.www-data /var/www/.local
似乎必须有一种更好的方法来完成此操作,而且我很确定,如果我以这种方式离开的话,将来还会有潜在的问题。问题似乎是Pyro4模块需要可供www-data用户使用。所以我的问题是,在运行apache2的Ubuntu linux上,www.data用户可以使用Pyro4模块的正确方法是什么?
编辑-添加
我还尝试执行以下操作:
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匹配的发行版”
看起来有点像这个问题https://superuser.com/questions/646062/granting-write-permissions-to-www-data-group
我想建议使用PYTHONPATH环境变量来指向www-data用户可读的库安装位置,在该位置将需要访问的python模块复制到该位置,但是我认为这在当今是不正确的。
最好的办法是使用www.data用户创建一个Python Virtualenv,并使用该virtualenv中的pip命令将所有必需的模块安装到其中。您可能必须使用一些sudo / chown舞蹈才能正确完成此操作。
另一种方法也许是根本不用打扰python子进程,而是使用Pyro的HTTP网关。这样,您只需从PHP向本地运行的Pyro http网关进程发出HTTP请求,即可将其转换为正确的Pyro调用。我不了解PHP,但在我看来,向运行在某些本地主机端口上的服务器发出自定义http请求应该很容易。这也可能更快,因为您不会为每个调用都启动python进程。
(edit):另一个成功的解决方案似乎是以下解决方案,其中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文件夹,而不是全局系统python的lib文件夹。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句