从PHP运行Python脚本时不会导入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
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.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/)