Ubuntu下PHP执行Python3无法识别已安装pandas模块问题排查
问题根因
Ubuntu环境下,通过PHP的exec执行命令时,运行身份是web服务的系统用户(默认是www-data),和你终端登录操作的普通用户不是同一身份:
- 你在终端执行
pip3 install pandas时,默认是给当前登录的普通用户安装用户级Python包,包存储在普通用户家目录的专属site-packages路径下,仅当前普通用户有权限访问、加载 - 虽然终端和PHP环境查到的
python3路径都是/usr/bin/python3,但不同用户启动Python时加载的包搜索路径(sys.path)不一样,www-data用户不会加载普通用户家目录下的包路径,也没有权限访问对应目录,因此找不到pandas模块
Mac系统默认web服务的用户权限、Python包路径加载逻辑和Ubuntu有差异,因此不会触发该问题。
解决方案
按部署便捷度从高到低可选以下方案:
- 方案1:全局安装pandas(最省事,适合单服务器简单部署场景)
直接给系统全局Python环境安装pandas,所有用户都可正常调用,注意必须指定调用/usr/bin下的python3来执行pip,避免装错Python版本:sudo /usr/bin/python3 -m pip install pandas==1.4.3
安装完成后,在PHP中执行pip3 list即可看到pandas,原有脚本无需修改即可正常运行。 - 方案2:脚本内指定包搜索路径(不想修改全局环境时可选)
先在终端执行命令查询当前普通用户的pandas安装路径:/usr/bin/python3 -c "import pandas; print(pandas.__path__[0].rsplit('/',1)[0])"
拿到输出的site-packages路径后,在myscript.py最开头添加代码把该路径加入Python包搜索列表:
注意需要给import sys # 把下面路径替换成你刚才查到的实际site-packages路径 sys.path.append("/home/你的用户名/.local/lib/python3.x/site-packages") import pandaswww-data用户开放上述site-packages路径及上级目录的读/执行权限,否则依然会加载失败。 - 方案3:使用公共虚拟环境(适合多项目隔离部署场景)
创建一个所有用户均可访问的Python虚拟环境,在虚拟环境内安装pandas,之后修改PHP的exec调用逻辑,直接指定虚拟环境内的python解释器路径即可:
把PHP里的exec调用改成:# 创建全局可访问的虚拟环境 sudo mkdir -p /opt/python_venv sudo python3 -m venv /opt/python_venv/myproject # 在虚拟环境内装pandas sudo /opt/python_venv/myproject/bin/pip install pandas==1.4.3 # 给所有用户开虚拟环境的访问权限 sudo chmod -R 755 /opt/python_venvexec("/opt/python_venv/myproject/bin/python3 ./myscript.py", $output, $return_var);
该方式不会污染系统自带Python环境,不同项目可以用独立虚拟环境避免包版本冲突。
排查小技巧:可以分别在终端、PHP的exec中执行
/usr/bin/python3 -m site,对比输出的sys.path路径列表,就能直观看到两边加载的包路径差异。
内容的提问来源于stack exchange,提问作者sysSTD
相关产品推荐
相关产品推荐

