我仍在努力理解这我遇到了一个问题,并且已经阅读了大量有关sudo apt-get install python-XXX
vs的帖子pip install
,我了解它的要点(apt-get 是一个软件包存储库,由与 pip 完全不同的一组人管理,当有可用更新时,它会与其他所有内容一起自动更新,它是二进制文件等)。但是,有几件具体的事情我不明白,也无法找到答案:
如果我出于某种原因,首先使用 安装包(例如 numpy)
sudo apt-get install numpy
,然后稍后pip install numpy
。会发生什么?numpy 是否已安装再次其他地方有不同的版本(例如在 .local/lib 中),所以现在我有两个独立的版本?导入时使用哪一个?(如果我理解正确的话,它是独立的,apt-get 是系统范围的,但我看到了对这个问题的相互矛盾的回答,例如这里)我注意到 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
?还是说这很愚蠢?我注意到我的 pip 是 1.5.6 - 如果你这样做的话,它是当前的最新版本
sudo apt-get install python-pip
。而在 pip 上它是 8.0.2!我相信这给我带来了问题,因为使用旧版本,你可以一遍又一遍地安装同一个包,它不会发出警告。不知何故它不会覆盖旧版本。我意识到这一点是因为我可以继续卸载同一个包(例如 numpy),而当我这样做时它仍然在那里pip show numpy
。奇怪的是,总是显示相同的文件夹(.local/),但版本不同:S 所以我有两个与此相关的问题:a. 安装 pip 的最佳方法是什么?我目前倾向于
sudo apt-get install python-pip
、pip install pip
、sudo apt-get purge python-pip
。这样明智吗?对我来说这似乎有点荒谬。b. 现在我知道很多软件包都因重复安装而混乱,可能是因为有些软件包是用 apt-get 安装的,后来又用 pip 1.5.6 多次安装,检查重复并清理的最佳方法是什么?我猜用脚本卸载所有软件包并重新安装不安全?
PS 我不确定我是否应该将此作为新问题发布,还是作为对我原始问题的回应。由于这个问题更加简洁和笼统,我觉得最好将其分开。如果我错了,请原谅。
答案1
对于档案,经过多次反复尝试后,我发现了以下内容(回想起来,有些部分是有道理的,有些则相当令人困惑)。
如果你
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 版本。
旧版本 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 是 1.10.4,位于 ~/.local/lib/python2.7/site-packages
如果我
pip install numpy
再次这样做,它会再次下载并安装。因此,您可能会得到许多无法真正访问的不同版本。我可以做pip install numpy
5 次,然后我可以做pip uninstall numpy 5x
10 次!显然,您可以注意不要这样做,但有时其他软件的安装脚本有点粗心,可能会搞砸事情。令人难以置信的是,Ubuntu 官方发布了这个版本的 pip。
新的 v8.0.2(pip 本身的当前版本):
pip 的较新版本(例如 pip 上的 8.0.2)将拒绝安装相同的软件包,并表示要求已满足。因此您无法安装新版本。这是良好的行为(稍后将详细介绍如何获取此版本的 pip)。
在这种情况下,您只能升级,即使用 -U 标志进行安装。
但是,当您尝试
pip install -U xyz
使用 sudo apt-get 安装软件包时,您会收到权限错误,因为 apt-get 安装在 /usr/ 中,而您需要 root 访问权限才能在那里写入。因此据我所知,您别无选择,只能
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