在共享服务器上从php执行python脚本

2024-09-29 21:22:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在共享服务器(BlueHost)上从php执行一个python脚本(称为Filename.py)。python文件执行简单的web刮取,然后返回输出。我的代码看起来像这样

PHP文件

    <?php
    $url = 'example.com';
    $command = escapeshellcmd("python ../cgi-bin/filename.py $url");
    $output = exec($command);
    echo $output;
    ?>

Filename.py

    # Import libraries
    import sys
    import requests
    from bs4 import BeautifulSoup
    
    #capture url passed from php
    url = sys.argv[1]    # <= url from 
    
    #use python and beautifulsoup to scrape the specified webpage
    html_text = requests.get(url).text
    page = requests.get(url)
    soup = BeautifulSoup(page.text, 'html.parser')   
    Scrape = soup.find(...scrape logic...).text

    #send result back to php
    print(Scrape)

这段代码在我的桌面测试服务器上运行。也就是说,我可以执行php文件,它将运行python脚本,捕获web scrape的输出,并在我的web浏览器中显示它

但是,它在我的webhost服务器(BlueHost)上不起作用。我可以让这两个文件互相对话(例如,如果我在Filename.py中注释掉beautifulsoup逻辑,我可以让php文件将url文本发送到.py文件,我可以让.py文件将其复制回来,然后在web浏览器中显示)。所以我认为我的问题在于Python库

由于这是一个共享主机服务器,我无法安装pip或任何python库(如请求或Beauty soup)。但是,我可以安装python的本地版本(例如,升级到3.8.5而不是在BlueHost上运行标准版的2.7.5),并且我可以将库本地安装到我的BlueHost帐户,这是我根据以下指南完成的

https://www.bluehost.com/help/article/python-installation

http://thelazylog.com/install-python-as-local-user-on-linux

现在,在我的BlueHost SSH终端中,当我键入:

  • python --version=>;我明白了Python 3.8.5.
  • which python=>;我明白了home1/myusername/python/Python-3.8.5/python
  • python=>;Python 3.8.5已经发布
  • which pip=>;我明白了home1/myusername/.local/bin/pip
  • pip list=>;我看到一个库列表,包括我需要的requestsbeautifulsoup4 对于我的.py脚本

尽管如此,python脚本似乎仍在针对2.7.5版运行,并且它无法访问我安装的库。具体来说,当我注释掉Filename.py中的requestbeautifulsoup逻辑,并用 print(sys.version_info) 我可以看到python脚本仍在针对python 2.7.5运行;不是3.8.5或我安装的库

我被卡住了,欢迎来自Stack Overflow社区的输入

如何使Filename.py脚本在本地安装的Python版本和库上运行?库是关键,因为我相信我可以用Python 2.7.5解决这个问题

最后一点注意——我有python库文件的副本。我相信有一种方法可以将它们放在与我的.py文件相同的目录中,并在每次脚本运行时手动导入它们(而不是在服务器上安装它们)。但我不确定如何做到这一点,或者是否有更好的解决方案

提前感谢您的帮助


Tags: pip文件textpyimportgt服务器脚本

热门问题