从PHP运行python脚本时未导入python模块

时间:2018-09-10 22:22:44

标签: php python

我有一个Python脚本,当我在Terminal中运行它时,它可以很好地工作。在这里:

import bs4, requests, json, sys
from sys import argv

def getFsmonData(link):
    res = requests.get(link)
    res.raise_for_status()
    soup = bs4.BeautifulSoup(res.text)

    # Get table data
    tds = soup.select('td')
    new_td_list = []
    for i in range(len(tds)):
        inner_td_list = []
        for y in range(len(tds)):
            inner_td_list.append(tds[y].getText())
        new_td_list.append(inner_td_list)
    print(inner_td_list)
    td_list_json = json.dumps(inner_td_list)
    tdf = open("/path/to/file/data/td_data.txt", "w")
    tdf.write(td_list_json)
    tdf.close()

getFsmonData(sys.argv[1])

但是现在我试图从PHP运行它,并且出现以下错误:

  

回溯(最近通话最近):文件   导入bs4中的“ /path/to/file/example.py”第1行,   json,sys ModuleNotFoundError:没有名为“ bs4”的模块

我猜PHP认为我没有安装此模块,但是我不确定。这是我的PHP代码:

<?php
    $link = $_POST['dn-link'];

    if (isset($_POST['submit'])) {
        system('/usr/bin/python3 /path/to/file/example.py ' . escapeshellarg($link) . ' 2>&1', $retval);
    }
?>

谁可以帮助解决此问题?

2 个答案:

答案 0 :(得分:1)

我认为您误解了许可问题。并非您需要add it PHP。这是因为您的OS会跟踪权限,并且您分配给PHP解释器和Python解释器的权限未对齐。通常人们在这里混合使用两种权限-USER(是登录级别访问权限)和SYSTEM(是系统范围访问权限)。如果您是自己的开发机器,则将两者都添加到SYSTEM。

我们需要知道您的操作系统能够完全回答问题,我要猜测是哪种情况下的Mac OS(我认为目前无法对其进行测试)。

sudo nano "pathOfYourInterpreter"

另一件事可能正在发生,您尝试导入的库位于您已设置的当前系统路径无法到达的位置。例如,如果将Python的sys变量设置为解释器所在的目录,但是要导入的脚本位于另一个文件夹中。在这种情况下,您有几种访问这些脚本的选项。

  1. 在使用以下命令导入之前,将当前工作目录设置为它们所在的文件夹:

    os.chdir("locationOfScript/")
    import script.py
    
  2. 在运行时添加系统路径:

     sys.path.append("locationOfScript/)
    

还有更多的攻击方法,但是我认为这应该可以帮助您入门。

答案 1 :(得分:0)

最有可能在您的PHP脚本执行Python脚本时,以另一个用户(可能是超级用户)的身份执行它。您可以做的就是通过

检查软件包是否安装在超级用户下。
sudo pip list

或者如果您使用的是python3

sudo pip3 list

查看该命令是否列出了您要使用的软件包。

如果未列出它们,则可以通过以下命令轻松安装它们:

sudo pip install <pkg name>

sudo pip3 install <pkg name>

您在这里要做的是在超级用户(而不是本地用户)下安装软件包。