Ubuntu16下PHP7调用Anaconda Python3.6脚本时MySQLdb导入失败
这个问题我之前也碰到过,核心原因就是PHP执行环境和你终端用户的环境不一致,导致调用的Python不是你Anaconda里的那个版本,自然找不到已经安装的MySQLdb模块。具体来说有这几个常见情况:
PATH环境变量不匹配
你在终端里运行python时,调用的是Anaconda安装的Python(路径比如/home/your_username/anaconda3/bin/python),但PHP(不管是通过Apache还是php-fpm运行)的默认PATH里,优先调用的是系统自带的Python(比如/usr/bin/python),而系统Python里并没有安装MySQLdb。
解决办法很直接:在exec命令里指定Anaconda Python的绝对路径。先在终端里执行which python拿到你的Anaconda Python路径,然后把PHP代码改成:$tmp = exec("/home/your_username/anaconda3/bin/python script_name.py", $input_parameters );权限访问问题
PHP通常是以www-data用户身份运行的,而你的Anaconda环境可能只有你自己的用户有权限访问,导致www-data无法读取Anaconda下的MySQLdb模块文件。
可以先检查Anaconda环境目录的权限:比如ls -ld /home/your_username/anaconda3,确保其他用户有读权限。如果权限不足,可以用chmod调整,比如chmod -R o+r /home/your_username/anaconda3/lib/python3.6/site-packages/(只给site-packages目录加读权限更安全)。Anaconda环境未激活
你在终端里可能默认激活了Anaconda的base环境或者某个自定义环境,但PHP执行时不会自动加载这些环境配置。如果你的MySQLdb是安装在某个特定conda环境里的,需要在exec里先激活环境再运行脚本:$tmp = exec("source /home/your_username/anaconda3/etc/profile.d/conda.sh && conda activate your_env_name && python script_name.py", $input_parameters );注意:如果exec默认用的是sh shell,可能不支持
source,可以改成明确调用bash:$tmp = exec("/bin/bash -c 'source /home/your_username/anaconda3/etc/profile.d/conda.sh && conda activate your_env_name && python script_name.py'", $input_parameters );
快速排查方法
你可以在Python脚本开头加上这段代码,用来输出当前Python的路径和模块搜索路径:
import sys print("Python executable path:", sys.executable) print("Module search paths:", sys.path)
然后分别在终端运行脚本,和用PHP exec运行脚本,对比两者的输出,就能直观看到差异——比如终端里的Python路径是Anaconda的,而PHP调用的是系统Python,这样就能确认问题所在了。
内容的提问来源于stack exchange,提问作者Hayk

