如果我意外地pip install
安装了之前使用 的软件包,会发生什么apt-get
?我是否只能使用最新版本(即可能是我使用 安装的版本pip
)?反过来会发生什么?
注意:我不在虚拟环境中使用 Python(只是因为我不知道为什么要这样做——我使用 Python 作为数据分析工具,并且主要尝试使用所有东西的最新版本)。
答案1
正如 @Timo 在他的评论中提到的那样,python -c "import sys; print sys.path"
它将为您提供 Python 安装的 Python 模块加载路径。在相对较新的 16.04 安装中,有三个值得注意的目录(在我的总共 10 个目录中):
- ''(应用程序的目录)
- '/usr/local/lib/python2.7/dist-packages'(pip 安装模块的地方)
- '/usr/lib/python2.7/dist-packages'(其中 apt 安装模块)
然而,最重要的是要注意'/usr/local/lib/python2.7/dist-packages'的优先级高于'/usr/lib/python2.7/dist-packages'。
如果您首先通过 apt(-get) 安装 Python 包,它将安装到 '/usr/lib/python2.7/dist-packages' 中。如果您稍后尝试使用 pip 安装模块,pip 将首先发出警告,指出依赖关系已得到满足,然后退出;添加 --upgrade 标志将强制 pip 安装,将模块安装到 '/usr/local/lib/python2.7/dist-packages' 中。(请注意,输出还表明 '/usr/lib/python2.7/dist-packages' 中的版本未被卸载)然后,您可以使用以下命令验证 pip 安装的版本是否是正在使用的版本:python -c "import MODULE; print MODULE.__file__"
。
因此,这表明通过 pip 安装的包将优先于系统安装的包,但不会覆盖从 apt(-get) 安装的任何内容。
答案2
补充一下 @Bryan Wyatt 的观点,PIP 安装/升级的项目应该优先于(可能较旧的)APT 安装的软件包,这似乎是可取的(也是有意的)。我的系统将 apt 和 pip 路径颠倒了。应该是(忽略其他条目):
- '/usr/local/lib/python2.7/dist-packages'(pip 安装模块的地方)
- '/usr/lib/python2.7/dist-packages'(其中 apt 安装模块)
然而由于我采取了一些未知的行动,这些路径对我来说以相反的顺序出现(忽略其他条目):
- '/usr/lib/python2.7/dist-packages'(其中 apt 安装模块)
- '/usr/local/lib/python2.7/dist-packages'(pip 安装模块的地方)
事实证明我确实/usr/lib/python2.7/dist-packages
在 中添加了一些东西/usr/local/lib/python2.7/dist-packages/easy-install.pth
。只需从 中删除行即可easy-install.pth
解决我的错误排序问题。/usr/lib/python2.7/dist-packages
仍然在我的路径中,因为它在稍后的阶段被添加到其他地方。
附注:pprint 将更好地显示你的路径...即:
$ python -c "import sys; import pprint; pprint.pprint(sys.path)"
['',
'/usr/lib/python2.7',
'/usr/lib/python2.7/plat-x86_64-linux-gnu',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old',
'/usr/lib/python2.7/lib-dynload',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages/PILcompat',
'/usr/lib/python2.7/dist-packages/gtk-2.0',
'/usr/lib/python2.7/dist-packages/ubuntu-sso-client']