在使用pip将库安装到AWS EMR主节点上的virtualenv中时,为什么需要sudo?

时间:2019-01-22 17:13:58

标签: python linux pip amazon-emr

我正在尝试使用pip将库安装到驻留在AWS EMR主节点上的Python virtualenv中。出于某种原因,sudo pip可以正常工作,但非sudo pip 静默会失败。

一些背景:

  • 我正在启动版本为emr-5.19.0的EMR集群。
  • 我正在SSH进入使用Amazon Linux AMI 2018.03的主节点。
  • 默认情况下,此操作系统同时安装了Python 2.7和3.4。
  • 我基于已经安装的Python 3.4创建了一个新的virtualenv。
  • 我激活了新的virtualenv,并确认所有路径都指向我的venv安装(不是指向全局Python安装),例如which pythonwhich pip看起来都是正确的。

因此,我按照以下步骤创建并激活我的virtualenv:

cd /home/ec2-user/my_app
virtualenv --python=python3.4 venv
source venv/bin/activate

这有效。接下来,我尝试如下安装示例库:

pip install numpy

输出为:

Collecting numpy
Installing collected packages: numpy
Successfully installed numpy-1.16.0

但是,尽管输出声称成功,但import numpy仍会产生导入错误,并且numpy不会显示在pip listpip freeze中。我什至已经深入到path/to/venv/lib/python3.4/dist-packages并验证了没有创建numpy目录。

可悲的是,这确实有效

sudo path/to/venv/bin/pip install numpy

问题是:我不想使用sudo,因为那样会违抗best practices。但是,似乎大多数人都在使用sudo来完成此任务(例如herehere),所以也许这只是EMR环境中的要求?

注意:此问题仅在 some 库中发生。例如,pyspark和geocoder可以很好地安装,但是numpy和pandas却默默地失败了。

1 个答案:

答案 0 :(得分:0)

我最终弄清楚了这一点:pip有时(但并非总是)将模块放置在Python路径以外的特定目录中!这似乎是Amazon Linux和pip之间的known bug

例如,numpy被放置在:

path/to/venv/lib/python3.4/dist-packages/numpy

但是,pyspark被放置在:

path/to/venv/lib64/python3.4/dist-packages/pyspark

后一个目录位于Python路径上,但前一个目录不在。这就是import pyspark有效但import numpy无效的原因。我们可以强制pip将库安装到适当的目录中,如下所示:

pip install numpy --target='/path/to/venv/lib/python3.4/dist-packages'

上面的命令解决了我的问题。