AWS EMR Zeppelin中numpy加载Python2.7低版本而非指定高版本如何解决
问题解决方案
这个问题的根因是Python模块搜索路径的优先级问题,旧版本numpy所在的目录在搜索顺序中排在你安装的1.18.5版本目录之前,因此Python会优先加载旧版本。你可以按照以下步骤解决:
步骤1:确认当前加载路径和搜索顺序
在Zeppelin的pyspark解释器中执行以下代码,确认旧版本numpy的位置和模块搜索优先级:
import numpy # 输出当前加载的numpy文件路径,确认是不是Python2的目录 print(numpy.__file__) import sys # 输出Python模块搜索路径的顺序 print(sys.path)执行后可以看到1.14.5版本numpy的目录在1.18.5版本目录的前面。
步骤2:修复引导脚本的安装参数
你当前的引导脚本存在两个问题:
- 混用
sudo和--user参数:带sudo使用--user时,包会安装到root用户的私有目录,普通运行用户(包括Zeppelin的运行用户)无法访问 - 存在拼写错误:
sudp python3 -m pip install ipaddress==1.0.23中的sudp需要改为sudo
你可以删除引导脚本中所有
--user参数,并且给numpy的安装命令添加强制重装参数,修改后的对应语句为:sudo python3 -m pip install numpy==1.18.5 --force-reinstall修改完成后重新执行引导脚本即可。
- 混用
步骤3:临时验证方案(无需重跑引导脚本)
如果需要快速验证效果,可以在Zeppelin代码的最开头插入以下代码,强制把高版本numpy的目录放到搜索路径最前面:
import sys # 替换为你步骤1中查到的1.18.5版本numpy所在的site-packages目录路径 sys.path.insert(0, "/usr/local/lib/python3.6/site-packages") import numpy print(numpy.__version__)步骤4:永久生效方案(无需修改引导脚本)
你可以通过配置pth文件永久调整模块搜索路径优先级:
# 把高版本numpy所在的目录路径写入pth文件,Python启动时会自动加载 echo "/usr/local/lib/python3.6/site-packages" | sudo tee /usr/lib/python3.6/site-packages/custom_path.pth配置完成后重启Zeppelin的pyspark解释器即可生效。
步骤5:最彻底方案(卸载旧版本)
如果确认没有其他程序依赖旧版本numpy,可以直接卸载所有旧版本后重装指定版本:
# 卸载Python3环境中所有版本的numpy sudo python3 -m pip uninstall numpy -y # 重新安装1.18.5版本 sudo python3 -m pip install numpy==1.18.5
内容的提问来源于stack exchange,提问作者Explorer
相关产品推荐
相关产品推荐

