问题描述:
使用pip,我升级到最新版本的requests(版本2.7.0,pip显示请求给位置/usr/local/lib/python2.7/dist-packages)。当我在交互式命令行中导入请求和打印请求.__ version__时,我看到的是2.2.1版本。原来,Python正在使用预先安装的Ubuntu版本的请求(请求.__文件是/usr/lib/python2.7/dist-packages/requests/__init__.pyc – not / user / local / lib / .. )。
从我的调查中,这个事实是由Ubuntu对Python搜索路径的改变引起的(我运行Ubuntu 14.04),前提是Ubuntu的Python包的路径(对于我的机器,这发生在usr / local / lib / python2.7 / dist-包/易install.pth)。在我的情况下,这将导致apt-get版本的请求,这是使用Ubuntu预先打包的,而不是我想使用的pip版本。
我正在寻找:
我想在Ubuntu的Python安装目录路径之前,全球预先将pip的安装目录路径添加到Python的搜索路径(sys.path)中。由于我的许多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)
当Python开始时,该文件由site.py读取。由于其文件名以easy-install.pth字母数字的形式出现,所以后来由site.py消耗。总而言之,文件的第一行和最后一行前面加上sys.path的路径(这些行来自easy-install.pth)。
我不喜欢这个解决方案取决于文件名的字母数字顺序来正确放置新的路径。
PYTHONPATHs来自Ubuntu的路径
Stack Overflow上的Another answer对我来说没有效果。我的PYTHONPATH路径来自easy-install.pth中的路径,它使用我在“不满意的解决方案3”中提到的相同的代码来添加其路径。
先谢谢你!