终端中Python模块存在,PHP用shell_exec调用脚本时提示模块缺失
这问题我之前帮朋友排查过,核心原因就是PHP运行时的Python环境和你终端用的不是同一个!下面给你几个靠谱的解决步骤:
1. 使用终端Python的绝对路径调用脚本
首先在终端里执行以下命令,找到你平时用的Python的绝对路径:
which python # 或者 which python3,取决于你用的版本
假设输出是/usr/local/bin/python3,那把PHP里的shell_exec命令改成:
shell_exec("/usr/local/bin/python3 /Applications/MAMP/htdocs/pharm/Webmaps.py");
原因是MAMP的PHP默认可能调用系统自带的Python,而你装folium是装在自己用户的Python环境里的,换绝对路径就能让PHP用对环境。
2. 手动添加模块路径到Python脚本
如果第一步没用,先在终端里找到你的Python模块安装路径:
python -c "import sys; print('\n'.join(sys.path))"
找到包含folium的那个site-packages目录(比如/Users/你的用户名/Library/Python/3.9/lib/python/site-packages),然后在Webmaps.py的最开头加上这段代码:
import sys sys.path.append("/Users/你的用户名/Library/Python/3.9/lib/python/site-packages") import folium
这样就能强制脚本找到你安装的folium模块。
3. 检查并修复权限问题
PHP运行时的用户(通常是_www或者www-data)可能没有访问你用户目录下Python模块的权限。可以给模块目录添加可读权限:
sudo chmod -R 755 /Users/你的用户名/Library/Python/3.9/lib/python/site-packages
注意:这个操作要谨慎,避免给敏感目录开过高权限。
4. 给PHP使用的Python环境安装模块
如果上面的方法都不行,先确认PHP用的是哪个Python:
echo shell_exec("which python");
得到路径后,用这个路径来安装folium:
sudo /path/to/php/python -m pip install folium
这样就能让PHP调用的Python环境也有folium模块了。
为什么Windows下没问题?
Windows系统里Python的PATH配置通常比较统一,终端和PHP运行时调用的是同一个Python环境,所以不会出现模块找不到的情况;而Mac下系统自带Python和用户自行安装的Python是分开的,MAMP的PHP默认用系统版本,和你终端用的不是同一个,才会出现这个问题。
内容的提问来源于stack exchange,提问作者Dimitrios Arampatzis

