问题描述:
使用pip,我升级到了最新版本的请求(版本2.7.0,pip show requests给出了位置/usr/local/lib/python2.7/dist-packages).但是当我在交互式命令行中import requests打印requests.__version__时,我看到的是版本2.2.1.事实证明,Python正在使用预先安装的Ubuntu版本的请求(requests.__file__是/usr/lib/python2.7/dist-packages/requests/__init__.pyc- 不是/user/local/lib/...).
从我的调查来看,这个事实是由于Ubuntu对Python搜索路径的改变(我运行Ubuntu 14.04)引起了Ubuntu Python包的路径(对于我的机器,这种情况发生在usr/local/lib/python2.7/dist-packages/easy-install.pth).在我的情况下,这会导致使用apt-get预先与Ubuntu打包的请求版本,而不是我想要使用的pip版本.
我在找什么:
我希望sys.path在到Ubuntu的Python安装目录的路径之前,全局地将pip的安装目录路径预先添加到Python的搜索路径().由于在我的许多Python脚本中使用了请求(以及许多其他包),我不想手动更改计算机上每个文件的搜索路径.
令人不满意的解决方案1:使用virtualenv
使用virtualenv会对我的机器造成不必要的更改,因为我必须重新安装全局存在的每个包.我只想从Ubuntu的软件包升级到pip的软件包.
不满意的解决方案2:更改easy-install.pth
由于easy-install.pth每次easy-install使用都会被覆盖,easy-install.pth因此如果安装了新软件包,我的更改将被删除.此问题使我很难在我的机器上维护包.
不满意(但我到目前为止最好)解决方案3:添加一个单独的.pth文件
在与easy-install.pth相同的目录中,我添加了一个zzz.pth内容:
import sys; sys.__plen = len(sys.path)
/usr/lib/python2.7/dist-packages/test_dir
import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new)
Run Code Online (Sandbox Code Playgroud)
site.pyPython启动时会读取此文件.由于它的文件名easy-install.pth是以字母数字形式出现的,因此它会在site.py之后被消耗掉.总之,文件的第一行和最后一行预先添加路径sys.path(这些行取自easy-install.pth).
我不喜欢这个解决方案如何依赖于文件名的字母数字排序来正确放置新路径.
PYTHONPATHs来自Ubuntu的路径
Stack Overflow的另一个答案 …