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

使用Apache服务器使用PHP执行Python脚本,python,php,Python,Php,我遇到了一个奇怪的问题。我有一个从PHP脚本调用的Python脚本。这一切都是在Ubuntu 18.04的Apache服务器上运行的。Python脚本的一部分使用googledriveapi。编辑:在经过大量测试和复制后,我得出结论,只需导入以下Google Drive Python库和依赖项即可: 从web调用脚本时会弄乱脚本。我的意思是Python脚本似乎没有执行,我应该通过print语句获得的任何shell输出都不会返回到PHP脚本。在本地调用脚本(pythonmyscript.py)时,

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

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

奇怪的是,当我从Python脚本中删除这些import语句时,无论是从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
    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;
?>
下面是我的PHP脚本的样子:

#!/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
    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一起安装的另一个第三方Python库运行了两个测试,这实际上似乎是通过PHP执行脚本时导入任何第三方库的问题。

我发现了这一点。希望这能帮助任何有类似问题的人。当您从Apache服务器上提供的PHP脚本执行Python或shell脚本时,该脚本将作为用户运行,默认情况下为www数据

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

我理解,使用sudo安装pip包不是首选,因为在某些情况下,它可能会导致冲突问题;但是,这是解决大多数软件包问题的最简单方法。对于不起作用的情况,请查看infinigrove的以下答案:


最后,从我所看到的,为了安装一个作为www数据用户的pip包(sudo-u www数据pip安装包),www数据必须被授予sudo权限,这绝对不是一个推荐的解决方案。

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

找出服务器的最佳设置

还了解