【问题标题】:Executing a Python script with PHP using Apache server使用 Apache 服务器使用 PHP 执行 Python 脚本
【发布时间】:2020-01-22 16:43:33
【问题描述】:

我遇到了一个奇怪的问题。我有一个从 PHP 脚本调用的 Python 脚本。这一切都在 Ubuntu 18.04 上的 Apache 服务器上运行。部分 Python 脚本使用 Google Drive API。编辑:见底部 经过大量测试和复制后,我得出结论,只需导入以下 Google Drive Python 库和依赖项:

from __future__ import print_function
from googleapiclient import discovery
from httplib2 import Http
from oauth2client import file, client, tools
from googleapiclient.http import MediaIoBaseDownload

从 Web 调用脚本时会弄乱脚本。我的意思是 Python 脚本似乎没有执行,并且我应该通过 print 语句获得的任何 shell 输出都不会返回到 PHP 脚本。在本地调用脚本(python myscript.py)时,它工作得很好。

奇怪的是,当我从 Python 脚本中删除这些导入语句时,无论是从 PHP 还是从浏览器直接启动脚本都可以正常执行。在这两种情况下,我还能够将 shell 输出返回到 PHP 脚本。我已经为 Python 脚本提供了适当的权限,并且我已经将 Apache 配置为能够运行 CGI 脚本。这是我的 Python 脚本的样子:

#!/usr/bin/env python3
import cgitb

from __future__ import print_function
from googleapiclient import discovery
from httplib2 import Http
from oauth2client import file, client, tools
from googleapiclient.http import MediaIoBaseDownload

cgitb.enable()
print("Hello World")

这是我的 PHP 脚本的样子:

<?php
    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);

    $output = shell_exec("python path_to_my_script/myscript.py");
    echo $output;
?>

编辑: 我使用通过 pip 安装的另一个 3rd 方 Python 库运行了几个测试,这实际上似乎是通过 PHP 执行脚本时导入任何 3rd 方库的问题。

【问题讨论】:

    标签: python php


    【解决方案1】:

    您的问题是用户权限问题。您应该以拥有您的 python 环境的用户身份运行 Apache 服务器,或者允许运行服务器的用户在您的 python 环境中执行权限。

    This answer should help you 找出服务器的最佳设置。

    还可以阅读Apache VirtualHosts Configuration

    【讨论】:

      【解决方案2】:

      我想通了。希望这将帮助任何有类似问题的人。当您从 Apache 服务器上提供的 PHP 脚本执行 Python 或 shell 脚本时,该脚本将以用户身份运行,默认情况下为 www-data。

      通过运行命令 sudo -u www-data(以 www-data 用户运行以下命令)python myscript.py,我得到一个回溯错误,提示找不到 3rd 方模块。发生的情况是,默认情况下 pip(python 包管理器)在用户级别安装其包。这对大多数应用程序来说都很好,但在这种情况下会导致问题,因为 www-data 用户可以理解地找不到已安装的包,并且脚本崩溃了。从 PHP 脚本的角度来看,这变得特别棘手,因为它不理解这一点并且输出只是 null。

      我了解不推荐使用 sudo 安装 pip 包,因为它在某些情况下会导致冲突问题;但是,这是解决大多数软件包问题的最简单方法。对于这不起作用的情况,请查看 infinigrove 的这个答案: How to install Python Package for global use by all users (incl. www-data)

      最后,从我所见,为了以 www-data 用户(sudo -u www-data pip install package)安装 pip 包,必须授予 www-data sudo 权限,这绝对不是推荐的解决方案。

      【讨论】:

        猜你喜欢
        • 2017-03-22
        • 2016-09-27
        • 2014-05-06
        • 2018-08-04
        • 2011-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多