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

问题描述

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

PHP 文件

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

文件名.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 脚本,捕获网页抓取的输出,并将其显示在我的网络浏览器中。

但是,它在我的虚拟主机的服务器 (BlueHost) 上不起作用。我可以让这两个文件相互通信(例如,如果我在 Filename.py 中注释掉 beautifulsoup 逻辑,我可以让 PHP 文件将 url 文本发送到 .py 文件,我可以得到 . py 文件来模仿它,然后在网络浏览器中显示它。)所以我相信我的问题出在 Python 库上。

由于这是一个共享主机服务器,我无法安装 pip 或任何 python 库(如请求或漂亮的汤)。但是,我可以安装本地版本的 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 版本运行,并且它无法访问我安装的库。具体来说,当我注释掉 request 中的 beautifulsoupFilename.py 逻辑,并将最后一个 Python 打印行替换为 print(sys.version_info) 我可以看到 python 脚本仍在针对 Python 2.7.5 运行;不是 3.8.5 或我安装的库。

我被困住了,欢迎来自 Stack Overflow 社区的意见。

如何让我的 Filename.py 脚本针对本地安装的 Python 和库版本运行?库是关键,因为我相信我可以使用 Python 2.7.5。

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

预先感谢您的帮助!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)