apt-get install python-xxx vs pip install

mem*_*emo 8 package-management python apt pip

我仍在努力理解我遇到的这个问题,并阅读了大量关于sudo apt-get install python-XXXvs的帖子pip install,我理解它的主要内容(apt-get 是一个包 repo,由完全不同的人管理,用于 pip、auto -updates 以及其他所有内容,当有可用更新时,它是二进制等)。但是,有一些特定的事情我不明白,也无法找到答案:

  1. 如果我,无论出于何种原因,首先安装一个包,例如 numpy,使用sudo apt-get install numpy,然后我稍后安装pip install numpy。发生什么了?numpy 是否在其他地方再次安装不同版本(例如在 .local/lib 中),所以现在我有两个独立版本?导入时使用哪一个?(如果我理解正确,它是独立的,而 apt-get 是系统范围的,但我看到了对这个问题的相互矛盾的答复,例如在这里

  2. 我注意到 apt-get 上的许多软件包与 pip 相比已经很旧了。例如,在编写 ipython 2.3.0 与 4.0.3、numpy 1.10.2 与 1.10.4、spyder 2.3.5 与 2.3.8 时。它有什么优势,首先sudo apt-get install后跟一个pip install?或者这只是愚蠢?

  3. 我注意到我的 pip 是 1.5.6 - 如果你这样做,它是当前最新的sudo apt-get install python-pip。而在 pip 上是 8.0.2!我相信这给我带来了问题,因为使用旧版本,您可以一遍又一遍地安装相同的软件包,并且不会发出警告。不知何故,它没有覆盖旧的。我意识到这一点是因为我可以继续卸载相同的包(例如 numpy),并且在我卸载时它仍然始终存在pip show numpy。奇怪的是,总是显示相同的文件夹(.local/),但版本不同:S 所以我有两个与此相关的问题:

    一种。安装 pip 的最佳方法是什么?我目前倾向于sudo apt-get install python-pip, pip install pip, sudo apt-get purge python-pip。这是明智的吗?对我来说似乎有点可笑。

    湾 现在我知道我的很多包都被重复安装搞砸了,可能是因为有些是用 apt-get 安装的,然后用 pip 1.5.6 安装了多次,检查重复项并清理它的最佳方法是什么?我猜使用脚本来 pip uninstall all 并重新安装是不安全的?

PS我不确定我是否应该将其作为新问题发布或作为对原始问题的回应。由于这个问题更加简洁和笼统,我觉得最好分开。如果我弄错了,请道歉。

mem*_*emo 8

对于档案,经过多次反复试验,这就是我发现的(回想起来,有些是有意义的,有些则很混乱)。

  • 如果是sudo apt-get install python-xyz,该包出现在pip list. 当然你可以在python中导入它,但它不会出现在pip.get_installed_distributions()中。(显然相反的是正确的。即,如果你这样做,pip install xyz它不会出现在你的 apt/synaptic 中)

  • 之后,sudo apt-get install python-xyz如果你做pip install xyz了什么取决于你拥有的 pip 版本。

OLD v1.5.6(Ubuntu PPA 上的当前版本):

  • 这个版本的 pip (1.5.6) 只会在不同的位置安装一个新的 xyz 副本。你最终会得到多个副本,这会导致一团糟。例如:

    • 来自 apt-get 的 numpy 在 /usr/local/lib/python2.7/dist-packages 是 1.8.2
    • 来自 pip 的 numpy 是 1.10.4,位于 ~/.local/lib/python2.7/site-packages
  • 如果我pip install numpy再次这样做,它会再次下载并安装它。因此,您最终可能会得到许多您无法真正访问的不同版本。我可以做pip install numpy5 倍,然后我可以做pip uninstall numpy 5x几次!显然你可以注意不要这样做,但有时其他软件的安装脚本有点粗心,可能会把事情搞砸。令人难以置信的是,Ubuntu 正式发布了这个版本的 pip。

新 v8.0.2(pip 本身的当前版本):

  • 较新版本的 pip(例如 pip 上的 8.0.2)将拒绝安装相同的包,说要求已经满足。所以你不能安装新版本。这是一个很好的行为(稍后会详细介绍如何获取此版本的 pip)。

  • 在这种情况下,您只能升级,即使用 -U 标志安装。

  • 但是,当您尝试pip install -U xyz使用 sudo apt-get 安装的软件包时,您将收到权限错误,因为 apt-get 安装在 /usr/ 中,并且您需要 root 访问权限才能在那里写入。

  • 所以AFAIK你别无选择sudo pip install -U xyz,只能更新它。在这种情况下,pip 会将最新的软件包安装到 sudo apt-get 编写的相同位置。例如在我的情况下 /usr/local/lib/python2.7/dist-packages。这很好。

  • 还值得指出的是,apt 上的包通常比 pip 上的包老很多(例如 numpy v1.8.2 vs 1.10.4、scipy 0.14.1 vs 0.17.0、ipython 2.3 vs 4.0.3、spyder 2.3.5 vs 2.3.8)

所以我目前的想法是用sudo apt-get,例如 sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose spyder 来做大事

然后用sudo pip install -U.

注意从 pip 获取新的 pip 似乎很重要(非常元)

sudo apt-get install python-pip
sudo pip install -U pip
Run Code Online (Sandbox Code Playgroud)

PS 我知道 virtualenv 但我现在不需要它。我只需要一个开发环境。

这是一个小脚本,用于转储软件包列表、版本和路径(但仅适用于 pip 安装的模块,而不适用于 apt-get 的模块)

import pip
pp = pip.get_installed_distributions()
for p in sorted([p.location+"\t"+p.project_name+" ("+p.version+")" for p in pp]):
    print p
Run Code Online (Sandbox Code Playgroud)