You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含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,要么无法找到已安装的包。

具体解决步骤

  1. 验证www-data用户的Python环境
    在终端执行命令,切换到www-data用户并检查已安装包:

    sudo su - www-data -s /bin/bash
    python3 -m pip list | grep pymongo
    

    若没有输出,说明该用户环境下无pymongo。

  2. 为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
    
  3. 指定Python与脚本的完整路径
    终端的python3和www-data使用的可能不是同一个,先查Python完整路径:

    which python3
    

    假设输出为/usr/bin/python3,则修改PHP中的命令:

    $command = escapeshellcmd("/usr/bin/python3 /完整路径/myScript.py");
    
  4. 修复用户目录下的包权限
    若pymongo安装在终端用户的个人目录(如~/.local/lib/python3.x/site-packages),www-data可能无访问权限,可修改目录权限:

    sudo chmod -R o+r /home/你的用户名/.local/lib/python3.8/site-packages/pymongo
    

    请替换你的用户名和python3.8为实际值。

  5. 捕获错误输出排查问题
    修改PHP命令,将错误输出合并到标准输出,方便在浏览器查看具体报错:

    $command = escapeshellcmd("python3 myScript.py 2>&1");
    

内容的提问来源于stack exchange,提问作者Makis Sabanis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 15:15:26