含pymongo的Python脚本通过PHP的shell_exec执行时无法运行
我有一段Python脚本开头如下:
print("Start...") import pymongo import json
同时有如下PHP文件:
<html> <body> <?php echo "Start <br>"; $command = escapeshellcmd("python3 myScript.py"); $output = shell_exec($command); echo $output; ?> </body> </html>
当从浏览器运行该PHP脚本时,仅显示“Start”,执行未完成;移除import pymongo后,Python脚本可完整运行。
环境信息:
- ESXI上的Ubuntu 20.04.5 LTS虚拟机
- PHP v7.4.3
- MongoDB shell及服务器版本5.0.13
- PHP的MongoDB扩展v1.6.1
- pymongo v3.12.0
已尝试操作:修改Python文件及所在文件夹的权限(如chmod 777),无效果;终端运行含import pymongo的Python脚本完全正常。
核心原因
Web服务器运行用户(默认是www-data)的Python环境与终端登录用户的环境不一致——终端用的是当前用户的Python环境,pymongo已安装在该环境;但PHP执行Python脚本时,用的是www-data用户的环境,这个环境里要么没装pymongo,要么无法找到已安装的包。
具体解决步骤
验证www-data用户的Python环境
在终端执行命令,切换到www-data用户并检查已安装包:sudo su - www-data -s /bin/bash python3 -m pip list | grep pymongo若没有输出,说明该用户环境下无pymongo。
为www-data用户安装pymongo
直接以www-data身份安装:sudo su - www-data -s /bin/bash python3 -m pip install pymongo==3.12.0或通过sudo指定用户安装:
sudo -u www-data python3 -m pip install pymongo==3.12.0指定Python与脚本的完整路径
终端的python3和www-data使用的可能不是同一个,先查Python完整路径:which python3假设输出为
/usr/bin/python3,则修改PHP中的命令:$command = escapeshellcmd("/usr/bin/python3 /完整路径/myScript.py");修复用户目录下的包权限
若pymongo安装在终端用户的个人目录(如~/.local/lib/python3.x/site-packages),www-data可能无访问权限,可修改目录权限:sudo chmod -R o+r /home/你的用户名/.local/lib/python3.8/site-packages/pymongo请替换
你的用户名和python3.8为实际值。捕获错误输出排查问题
修改PHP命令,将错误输出合并到标准输出,方便在浏览器查看具体报错:$command = escapeshellcmd("python3 myScript.py 2>&1");
内容的提问来源于stack exchange,提问作者Makis Sabanis

