猿问

使用 Apache 服务器使用 PHP 执行 Python 脚本

我遇到了一个奇怪的问题。我有一个从 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 方库的问题。


拉丁的传说
浏览 195回答 2
2回答

小怪兽爱吃肉

您的问题是用户权限问题。您应该以拥有您的 python 环境的用户身份运行 Apache 服务器,或者允许运行服务器的用户在您的 python 环境中执行权限。这个答案应该可以帮助您找出服务器的最佳设置。另请阅读有关Apache VirtualHosts 配置的信息

猛跑小猪

我想通了。希望这将帮助任何有类似问题的人。当您从 Apache 服务器上提供的 PHP 脚本执行 Python 或 shell 脚本时,该脚本将以用户身份运行,默认情况下为 www-data。通过运行命令 sudo -u www-data(以 www-data 用户运行以下命令)python myscript.py,我得到了一个回溯错误,提示找不到第 3 方模块。发生的情况是,默认情况下 pip(python 包管理器)在用户级别安装其包。这对大多数应用程序来说都很好,但在这种情况下会导致问题,因为 www-data 用户可以理解地找不到已安装的包,并且脚本崩溃了。从 PHP 脚本的角度来看,这变得特别棘手,因为它不理解这一点并且输出只是 null。我知道不推荐使用 sudo 安装 pip 包,因为它在某些情况下会导致冲突问题;但是,这是解决大多数软件包问题的最简单方法。对于这不起作用的情况,请查看 infinigrove 的答案:&nbsp;如何安装 Python 包以供所有用户全局使用(包括 www-data)最后,从我所见,为了以 www-data 用户(sudo -u www-data pip install package)安装 pip 包,必须授予 www-data sudo 权限,这绝对不是推荐的解决方案.
随时随地看视频慕课网APP

相关分类

Python
我要回答