apt-get install python-xxx与pip install


8

我仍在尝试理解我遇到的这个问题,并且阅读了很多有关sudo apt-get install python-XXXvs 的文章pip install,并且我理解了它的精髓(apt-get是一个软件包回购,由完全不同的一群人管理,可以通过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 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。那明智吗?对我来说似乎有点荒谬。

    b。既然我知道我的很多软件包都被重复安装弄乱了,可能是因为有些软件包是用apt-get安装的,后来又用pip 1.5.6多次安装了,检查重复和清理的最佳方法是什么?我猜测使用脚本来pip全部卸载并重新安装是不安全的吗?

PS:我不确定是否应该将其发布为新问题还是对原始问题的答复。因为这个问题更加简洁和笼统,所以我认为将其分开会更好。抱歉,如果我弄错了。



我实际上在我的问题中提到了该帖子,这对于消除我的许多困惑非常有帮助,但它并不能回答我上面的问题(至少我看不到它)
备忘录

哦,还有另一个问题。我只是查看了链接文章列表,却没有在列表中看到。
muru

Answers:


8

对于档案库,经过反复试验,这是我发现的内容(回想起来,有些地方是有道理的,而另一些则很令人困惑)。

  • 如果您使用sudo apt-get install python-xyz该软件包,则该软件包显示在中pip list。当然,您可以在python中导入它,但它不会出现在pip.get_installed_distributions()中。(显然相反是正确的。即,如果您这样做pip install xyz,它将不会出现在您的apt /突触中)

  • 之后,sudo apt-get install python-xyz如果执行此操作pip install xyz,则取决于您拥有的点子的版本。

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

  • 此版本的pip(1.5.6)只会在其他位置安装xyz的新副本。您最终将获得多份副本,这会造成巨大的混乱。例如:

    • 来自apt-get的numpy是1.8.2,位于/usr/local/lib/python2.7/dist-packages
    • 来自pip的numpy在〜/ .local / lib / python2.7 / site-packages中为1.10.4
  • 如果我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与1.10.4,scipy 0.14.1与0.17.0,ipython 2.3与4.0.3,spyder 2.3.5与2.3.8)

所以我目前的想法是,以获得与大事情sudo apt-get,例如 sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy pytho正鼻涕的Spyder

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

注意:从点子中获取新点子似乎非常重要(非常中继)

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.