我有一个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);
}
?>
谁可以帮助解决此问题?
答案 0 :(得分:1)
我认为您误解了许可问题。并非您需要add it PHP
。这是因为您的OS会跟踪权限,并且您分配给PHP解释器和Python解释器的权限未对齐。通常人们在这里混合使用两种权限-USER(是登录级别访问权限)和SYSTEM(是系统范围访问权限)。如果您是自己的开发机器,则将两者都添加到SYSTEM。
我们需要知道您的操作系统能够完全回答问题,我要猜测是哪种情况下的Mac OS(我认为目前无法对其进行测试)。
sudo nano "pathOfYourInterpreter"
另一件事可能正在发生,您尝试导入的库位于您已设置的当前系统路径无法到达的位置。例如,如果将Python的sys变量设置为解释器所在的目录,但是要导入的脚本位于另一个文件夹中。在这种情况下,您有几种访问这些脚本的选项。
在使用以下命令导入之前,将当前工作目录设置为它们所在的文件夹:
os.chdir("locationOfScript/")
import script.py
在运行时添加系统路径:
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>
您在这里要做的是在超级用户(而不是本地用户)下安装软件包。