问题描述
我正在尝试从共享服务器 (BlueHost) 上的 PHP 执行 python 脚本(称为 Filename.py)。 python 文件执行一个简单的网络抓取,然后返回一个输出。我的代码看起来像这样。
<?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
=> 我看到一个库列表,包括我需要的requests
和beautifulsoup4
对于我的 .py 脚本。
尽管如此,python 脚本似乎仍在针对 2.7.5 版本运行,并且它无法访问我安装的库。具体来说,当我注释掉 request
中的 beautifulsoup
和 Filename.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 (将#修改为@)