apt-get install python-xxx vs pip install

我仍然试图理解我遇到的这个问题并阅读了大量有关sudo apt-get install python-XXX vs pip install的post,我理解它的主旨(apt-get是一个包回购,管理由完全不同的人群进行点击,当有可用的更新时,自动更新以及其他所有内容,它是二进制等)。 然而,有一些我不理解的特定事物,并且无法找到答案:

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

  2. 我注意到apt-get上的很多软件包与pip相比都很老了。 例如,在编写ipython 2.3.0 vs 4.0.3时,numpy 1.10.2 vs 1.10.4,spyder 2.3.5 vs 2.3.8。 首先是sudo apt-get install然后是pip install有什么好处吗? 或者那只是愚蠢的?

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

    一个。 安装pip的最佳方法是什么? 我目前倾向于sudo apt-get install python-pippip install pipsudo apt-get purge python-pip 。 那是明智的吗? 这对我来说似乎有点荒谬。

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

PS我不确定是否应将此作为新问题发布或作为对原始问题的回复。 由于这个问题更加简洁和一般,我觉得它会更好地分开。 如果我弄错了,请道歉。

对于档案,经过多次试验和错误后,这就是我所发现的(回想起来,有些内容有意义,有些则相当混乱)。

  • 如果你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是1.8.2 at /usr/local/lib/python2.7/dist-packages
    • 来自pip的numpy在〜/ .local / lib / python2.7 / site-packages中是1.10.4
  • 如果我再次执行pip install numpy ,它会再次下载并安装它。 所以你可能最终得到许多你无法真正访问的版本。 我可以做pip install numpy 5次,然后我可以做pip uninstall numpy 5x次! 显然你可以注意不要这样做,但有时其他软件的安装脚本有点粗心,可能搞砸了。 难以置信的是Ubuntu正式发布了这个版本的pip。

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

  • 较新版本的pip(例如8.0.2在pip上)将拒绝安装相同的包,说已满足要求。 所以你无法安装新版本。 这是一个很好的行为(更多关于以后获得此版本的pip)。

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

  • 但是,当您尝试在安装了sudo apt-get的软件包上pip install -U xyz时,您将获得权限错误,因为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 pytho n-nose spyder

然后使用sudo pip install -U更新它们(或至少其中一些)。

NB从pip获得新的pip似乎非常重要(非常元)

 sudo apt-get install python-pip sudo pip install -U pip 

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