我正在尝试使用pip将库安装到驻留在AWS EMR主节点上的Python virtualenv中。出于某种原因,sudo pip可以正常工作,但非sudo pip 静默会失败。
一些背景:
which python
,which 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 list
或pip freeze
中。我什至已经深入到path/to/venv/lib/python3.4/dist-packages
并验证了没有创建numpy
目录。
可悲的是,这确实有效:
sudo path/to/venv/bin/pip install numpy
问题是:我不想使用sudo,因为那样会违抗best practices。但是,似乎大多数人都在使用sudo来完成此任务(例如here和here),所以也许这只是EMR环境中的要求?
注意:此问题仅在 some 库中发生。例如,pyspark和geocoder可以很好地安装,但是numpy和pandas却默默地失败了。
答案 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'
上面的命令解决了我的问题。