Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从PHP运行Python脚本时不会导入Python模块_Php_Python - Fatal编程技术网

从PHP运行Python脚本时不会导入Python模块

从PHP运行Python脚本时不会导入Python模块,php,python,Php,Python,我有一个Python脚本,当我在终端中运行它时,它工作得很好。这是: 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.selec

我有一个Python脚本,当我在终端中运行它时,它工作得很好。这是:

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运行它,我得到以下错误:

回溯(最近一次调用上次):文件 “/path/to/file/example.py”,导入bs4中的第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);
    }
?>


谁能帮助解决这个问题?

最有可能的情况是,当您的PHP脚本执行Python脚本时,它会作为不同的用户(可能是超级用户)执行。您可以做的是通过执行以下操作来检查包是否安装在超级用户下

sudo pip list
或者如果你用的是蟒蛇3

sudo pip3 list
查看您想要使用的软件包是否在此命令中列出

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

sudo pip install <pkg name>
sudo-pip安装

sudo pip3安装

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

我认为你误解了许可问题。这并不是说你需要在PHP中添加它。这是因为您的操作系统跟踪权限,并且您分配给PHP解释器和Python解释器的权限不一致。在这里,人们通常会混淆两种权限:用户权限(即登录级别的访问权限)和系统权限(即系统范围的访问权限)。如果您在自己的开发人员机器上运行,则将这两个程序都添加到系统中

我们需要知道你的操作系统才能完全回答这个问题,我猜Mac操作系统在哪种情况下会是这样(我想,现在还不能测试它)

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

  • 在导入之前,将当前工作目录设置为它们所在的文件夹,方法是:

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

     sys.path.append("locationOfScript/)
    

  • 有更多的攻击方法,但我认为这应该让你开始

    当从PHP调用脚本时,与从命令行调用脚本时,您的脚本以不同的用户身份运行,因此您需要设置该用户的Python环境,以便它可以找到模块。为什么要降级?那些贬低这一行为的人就好像这是一个常识问题。我问这个问题是因为我自己可能无法解决它。@kind你想说的是,如果我以
    sudo
    运行它,它会工作吗?的确如此not@tera_789,在我看来,您正在尝试运行python文件,而不是python解释器。我不是百分之百肯定你的PHP代码。您熟悉操作系统上启动子进程的协议吗?通常,您必须启动解释器并将文件传递给解释器,而不是直接运行.py文件。通常,这要求您之前已将解释器添加为具有适当权限的环境变量。编写一个简单的脚本,只打印
    sys.path
    ,并在PHP环境和常用命令行中运行它。
    sudo pip3 list
    显示在PHP:
    beautifulsoup4(4.6.3)
    确切地说,我刚刚用
    sys.path.append(“locationOfScript/”)
    解决了这个问题。当我从PHP运行
    print(sys.path)
    时,模块的安装路径丢失了。我在Python脚本的顶部添加了
    sys.path.append(“locationOfScript/”)
    ,问题得到了解决。谢谢你well@JamieMarshall,@tera_789你能给我解释一下这个“locationOfScript/”是什么吗?我不明白在“locationOfScript/”中应该提到什么@DhanuK-你的脚本所在的路径(目录)需要替换为“locationOfScript/”
    os.chdir("locationOfScript/")
    import script.py
    
     sys.path.append("locationOfScript/)