为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉丁的传说 2022-07-05 19:33:11
我遇到了一个奇怪的问题。我有一个从 PHP 脚本调用的 Python 脚本。这一切都在 Ubuntu 18.04 上的 Apache 服务器上运行。部分 Python 脚本使用 Google Drive API。编辑:见底部经过大量测试和复制后,我得出结论,只需导入以下 Google Drive Python 库和依赖项:from __future__ import print_functionfrom googleapiclient import discoveryfrom httplib2 import Httpfrom oauth2client import file, client, toolsfrom googleapiclient.http import MediaIoBaseDownload从 Web 调用脚本时会弄乱脚本。我的意思是 Python 脚本似乎没有执行,并且我应该通过 print 语句获得的任何 shell 输出都不会返回到 PHP 脚本。在本地调用脚本(python myscript.py)时,它工作得很好。奇怪的是,当我从 Python 脚本中删除这些导入语句时,它在 PHP 和从浏览器直接启动脚本时都可以正常执行。在这两种情况下,我还能够将 shell 输出返回到 PHP 脚本。我已经为 Python 脚本提供了适当的权限,并且我已经将 Apache 配置为能够运行 CGI 脚本。这是我的 Python 脚本的样子:#!/usr/bin/env python3import cgitbfrom __future__ import print_functionfrom googleapiclient import discoveryfrom httplib2 import Httpfrom oauth2client import file, client, toolsfrom googleapiclient.http import MediaIoBaseDownloadcgitb.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 方库的问题。
查看完整描述

2 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

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

这个答案应该可以帮助您找出服务器的最佳设置。

另请阅读有关Apache VirtualHosts 配置的信息


查看完整回答
反对 回复 2022-07-05
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

我想通了。希望这将帮助任何有类似问题的人。当您从 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 的答案: 如何安装 Python 包以供所有用户全局使用(包括 www-data)

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


查看完整回答
反对 回复 2022-07-05
  • 2 回答
  • 0 关注
  • 193 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号