【发布时间】:2015-10-03 12:40:17
【问题描述】:
问题描述:
使用 pip,我升级到了最新版本的 requests(版本 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)。就我而言,这会导致使用与 Ubuntu 预打包的 apt-get 版本的请求,而不是我想要使用的 pip 版本。
我在寻找什么:
我想在 Ubuntu 的 Python 安装目录的路径之前将 pip 的安装目录路径全局添加到 Python 的搜索路径 (sys.path)。由于我的许多 Python 脚本中都使用了请求(以及许多其他包),因此我不想手动更改我机器上每个文件的搜索路径。
不满意的解决方案 1:使用 virtualenv
使用virtualenv 会对我的机器造成不必要的更改,因为我必须重新安装全局存在的每个包。我只想从 Ubuntu 的包升级到 pip 的包。
不满意的解决方案 2:更改 easy-install.pth
由于每次使用 easy-install 时都会覆盖 easy-install.pth,因此如果安装了新软件包,我对 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)。
我不喜欢这个解决方案如何依赖文件名的字母数字顺序来正确放置新路径。
PYTHONPATH 位于 Ubuntu 的路径之后
Stack Overflow 上的Another answer 对我不起作用。我的 PYTHONPATH 路径位于 easy-install.pth 中的路径之后,它使用我在“不满意的解决方案 3”中提到的相同代码来添加其路径。
提前谢谢你!
【问题讨论】:
-
pip选对了吗python? -
你有没有考虑过使用apt-get来移除预打包的版本?
-
报告一个针对 Ubuntu 的错误,即用户的决定没有得到尊重。
-
你是手动安装python-requests,还是依赖它?
-
@aragilar 我们直接通过 pip 安装请求。
标签: python ubuntu pip easy-install pythonpath