如何使用 PHP 和 Apache Web 服务器正确调用 Python Pyro 客户端?

How do I properly call a Python Pyro client using PHP and Apache web server?

我有一个 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 用户可用。所以我的问题是,在 Ubuntu linux 运行ning apache2 上让 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's HTTP gateway。这样你就可以简单地从 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 的文件夹。