pip 会覆盖 apt-get 安装的包吗?

pip 会覆盖 apt-get 安装的包吗?

如果我意外地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']

相关内容