<p>pip v10 破坏 Debian/Ubuntu pip3 命令</p>

创建于 2018-04-14  ·  42评论  ·  资料来源: pypa/pip

维护者注意:任何仍然遇到此问题的人请参阅 #5599。


  • 点子版本:10.0.0
  • Python版本:3.5.2
  • 操作系统:Ubuntu 16.04(编辑:也在debian:9.4上测试,同样的事情发生)

描述:

在至少 Ubuntu 16.04 上升级 pip(到 v10)时, pip3命令停止工作(“无法导入 main”,见下文)。 这是全新安装。

我跑过的:

(请注意,我已经删除了所有 apt 输出等,因为我认为这里不需要它。如果您还想要它,请告诉我!)

me@host$ sudo docker run -it ubuntu:xenial

root@container# apt update && apt install python3-pip

root@container# pip3 --version
pip 8.1.1 from /usr/lib/python3/dist-packages (python 3.5)

root@container# pip3 install --upgrade pip
Collecting pip
  Downloading pip-10.0.0-py2.py3-none-any.whl (1.3MB)
    100% |################################| 1.3MB 1.4MB/s 
Installing collected packages: pip
  Found existing installation: pip 8.1.1
    Not uninstalling pip at /usr/lib/python3/dist-packages, outside environment /usr
Successfully installed pip-10.0.0

root@container# pip --version
pip 10.0.0 from /usr/local/lib/python3.5/dist-packages/pip (python 3.5)

root@container# pip3 --version
Traceback (most recent call last):
  File "/usr/bin/pip3", line 9, in <module>
    from pip import main
ImportError: cannot import name 'main'

root@container# cat /usr/bin/pip3
#!/usr/bin/python3
# GENERATED BY DEBIAN

import sys

# Run the main entry point, similarly to how setuptools does it, but because
# we didn't install the actual entry point from setup.py, don't use the
# pkg_resources API.
from pip import main
if __name__ == '__main__':
    sys.exit(main())

不确定这是否应该在 pip 端或 Debian 端修复。

downstream

最有用的评论

我们通过在 bash 中清除哈希解决了这个问题:

$ hash -d pip

或在破折号 (sh) 中:

$ hash -r pip

所有42条评论

那是 debian 的问题

额外注意 - 使用 pip 替换系统 pip 始终是一种系统破坏行为,造成它的人应对后果负责

我建议您应该等待来自 Debian 的适当的 pip 10 打包副本 - 正如@RonnyPfannschmidt所说,您不应该使用 pip 来升级您的系统包...

看起来 Debian pip3 脚本使用了 pip 的内部结构,因此获得 pip10 兼容修复肯定取决于他们(我完全希望他们等待发布他们的 pip10 包,直到他们完成排序)。

额外注意 - 使用 pip 替换系统 pip 始终是一种系统破坏行为,造成它的人应对后果负责

说服 debian/ubuntu 人不要供应商,然后让他们的一半包腐烂,这将是一个有效的论点。

您可以使用 virtualenv 或 venv 将自己与系统 pip 安装隔离开来。

你不应该修改包管理器管理的文件(这里是系统 pip 安装)——我认为他们不希望用户修改东西——Debian 可能不支持它。 难免会出现这样的问题。

Fedora 上也有同样的问题。

也许应该有一个“测试版”频道,或者一些类似的机制,让人们在发布之前做更多的测试,而不是仅仅在 pypi 上倾倒一个损坏的版本并导致每个人的构建爆炸。

@fake-name 有两个预发布版本:

@fake-name 另外,在所有发行版上使用的一般建议是 - 使用 virtualenv,不要破坏系统,这是有效的 - 人们只是跟随它,然后想知道什么时候东西坏了并责怪 pip

使用 virtualenvs 进行了大量手动和自动测试

同样在 virtualenv 中,至少不应该有 debian 制作的 pip3 命令 - 那么你到底在说什么 wrt 这个在 virtualenvs 中的破坏 - 请提供足够的数据来实际验证而不是抱怨损坏而不提供验证它们所需的数据

pip 是由志愿者驱动的,而不是拥有数十名员工的公司

~删除~。 将此与https://github.com/pypa/pip/issues/5220混淆

我是德普。

谢谢,没有意识到更换系统 pip 是一个坏主意,但它是有道理的。 但是,如果 pip 在这种情况下不会唠叨升级,那将是很好的用户体验。 那可能吗? 我认为很多人(包括我)只会做任何“事情”要求他们做的事情。

@fake-name 感谢您的跟进 - 当一个主要版本具有多方面的影响并且其中的一部分试图毁了你的一天时,与细节问题不匹配是非常普遍的

如果 pip 在这种情况下不会唠叨升级,那将是很好的用户体验

分发供应商当然可以修补 pip 以删除该警告(或者更好的是,将其替换为针对系统包的类似检查)以及他们制作的其他补丁。 我不确定基本 pip 如何在没有发行版合作的情况下检测到它是从系统打包安装中运行的,但是如果有办法做到这一点,我们可以考虑(但请注意,根据我的经验,我们得到由于我们根本不包括启发式方法而导致此类启发式方法错误,因此会产生很多负面反馈......)

总是比 pip3 更喜欢“python3 -m pip”或者更好的“/usr/bin/env python3 -m pip”它更安全,并且可以避免 pip10 出现这个问题

我们通过在 bash 中清除哈希解决了这个问题:

$ hash -d pip

或在破折号 (sh) 中:

$ hash -r pip

在构建 docker 镜像时也遇到了这个问题。

@RonnyPfannschmidt说“使用 pip 替换系统 pip 始终是一种系统破坏行为,造成它的人应对后果负责”,有 6 个赞。 我发现这是一个特别迟钝的评论,因为我是通过 pip 本身指示这样做的:

_您使用的是 pip 8.1.1 版,但 10.0.0 版可用。
您应该考虑通过“pip install --upgrade pip”命令进行升级。_

如果该评论有一定的道理,那么 pip 的创建者应该删除此消息,我会鼓励

@qacollective - 我认为这里的论点是发行版已经采用了 pip,对其进行了修改,并将其重新打包到他们的存储库中。 因此,消息仍然存在并不是 Pypi 的错。

这主要是因为许多发行版非常努力地将所有内容重新打包到他们自己的包存储库中。 大多数情况下,这些东西会腐烂。

就个人而言,至少对于 ubuntu 上的 python,我希望他们放弃它。 apt 中基本上每个 python 包的版本范围从非常非常老到僵化。 Apt 对 python 来说基本没用,恕我直言。


FWIW,我倾向于发现最好的选择是从不首先安装发行版 pip,而是通过get-pip.py手动安装它。 这样,您就不会遇到平台包管理器只知道部分python 包的问题。

始终使用 --user 以避免杀死您的系统

/usr/bin/env python3 -m pip intall --user --upgrade pip

应该处理大多数有问题的情况,并导致在˜/.local/bin安装正确版本的 pip。

我可以确认@standag的解决方案有效。

一点背景:在 vanilla ubuntu 16.04 (AWS AMI) 上升级 (pip install -U pip) 后,会出现以下情况:
$PATH=..:/usr/local/ bin:... :/usr/ bin:...
/usr/bin/pip 仍然是旧的/'oem' 版本(已损坏)
/usr/local/bin/pip 是新的 v10 脚本(直接调用时工作正常)

即使正确的 pip 版本在 PATH 中损坏的版本之前,bash 仍会记住旧版本,因此当您像 'pip' 一样调用它时,您将运行旧的、损坏的版本。 hash-d pip 或 hash -r 解决了这个问题。

首先,关于 Debian/Ubuntu(可能还有更多 Linux 发行版)上发生的事情的一些说明:

  • pip 不支持通过导入来使用它的内部。 更多关于这里的文档。
  • Debian(因此是 Ubuntu)不支持使用不是他们的包管理器的东西来修改他们的包管理器管理的文件。

这个问题是由,好吧,两者都在某种程度上被侵犯了。

  • Debian 使用 pip 的内部方法(由于 pip 内部结构的重组,该方法不再有效)。 Debian 在这里假设其存储库中的 pip 版本是要安装的版本。
  • 以 root 身份运行pip install --upgrade pip ,没有任何其他参数会修改应该由 apt 管理的文件,这会破坏 Debian 的脚本。

Linux 上的一些一般提示:

  • 在 venv 之外使用--user是一个好习惯。

    pip install --upgrade --user pip
    
  • 除非您知道自己在做什么,否则切勿使用 sudo 运行 pip。


解决方法是什么?

当这是由 bash 缓存可执行文件引起的时, @standag解决方案很有用。

hash -r pip # or hash -d pip

如果您修改了操作系统包管理器的 pip 安装(例如通过使用sudo pip )并且python -m pip仍然有效,一种解决方法是卸载 pip 安装版本并重新安装包管理器安装版本.

python -m pip uninstall pip  # this might need sudo
sudo apt install --reinstall python-pip

如果您不在 Debian/Ubuntu 上_并且 pip 为您损坏,请尝试运行:

python -m pip install --force-reinstall pip

如果以上这不能解决您的问题,请提交一个新问题。


[由@pradyunsg编辑:使其更相关,以便将有类似问题的每个人与此评论联系起来; 更新建议以包括卸载/重新安装解决方法]

在docker之外解决它怎么样? 它在我的常规系统中坏了,哈希命令无法识别 pip。
thinkdigital@thinkdigital-HP-Spectre-x360-Convertible:~$ hash -d pip bash: hash: pip: not found

我发现 pip3,版本 9.0.1 安装在一个项目的 virtualenv 中,并将其复制到我的 /usr/bin 中,它又可以正常工作了。 以下是 pip3 可执行文件的内容,供那些也想自行修复的人使用。

# -*- coding: utf-8 -*-
import re
import sys

from pip import main

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(main())

我确定您要做的就是将其保存到一个名为 pip3 的文件中,通过运行 sudo chmod +x ./pip3 使其可执行,运行 sudo apt remove python3-pip,然后通过运行 sudo 将其复制到 bin 目录cp ./pip3 /usr/bin.
这是那些只想下载和移动它的人的原始文件。
pip3.zip

这个对我有用:
curl https://bootstrap.pypa.io/get-pip.py | 须藤蟒

很抱歉,但我想指出,从某些具有 root 访问权限的网站上运行 curl 的 python 代码是非常不安全的。

同意,我应该指出这不是官方的 pip 推荐。 正如多次所述,您应该使用系统包管理器来更新或以其他方式管理您的系统 pip 安装,而不是get-pip,甚至是通过 sudo pip 本身。

在这种情况下,来自系统包管理器的版本不起作用。 甚至
清除并重新安装后。

2018 年 4 月 19 日星期四,凌晨 1 点 53 分,Paul Moore通知@ github.com 写道:

同意,我应该指出这不是官方点子
推荐。 正如多次所述,您应该使用
您的系统包管理器来更新或以其他方式管理您的系统 pip
安装,而不是get-pip,甚至是通过 sudo pip 本身。


您收到此消息是因为您发表了评论。
直接回复本邮件,在GitHub上查看
https://github.com/pypa/pip/issues/5221#issuecomment-382660881或静音
线程
https://github.com/notifications/unsubscribe-auth/AV-Hfecz8l1NEyq3vsih0DpNP7QYdxuvks5tqFCdgaJpZM4TVEq6
.

如果重装系统包还是不行,检查一下/usr/local/下是否有pip10,删除整个文件夹。

替换 /usr/bin 中的那个对我有用,即使我认为那是
系统包管理器正在安装的那个。

[ @pradyunsg 截取邮件内容]

@ThinkDigitalRepair以下有帮助吗?

在其他情况下,您需要在安装/升级软件包时传递--user 。 TBH,在 Linux 上,使用--user是一个好习惯。

pip install --upgrade --user pip

行。 谢谢。 我按照他们的 Jupyter Notebook 教程搞砸了
告诉您直接升级 pip 的站点。 无需复制粘贴
明知后果再次袭来。 :(

[ @pradyunsg 截取邮件内容]

@ThinkDigitalRepair pip 10 希望能改进一些东西——当这种情况发生时,它会打印更好的错误消息而不是长的 PermissionError。

现在关闭这个问题,因为从 pip 结束这里没有任何可操作的。

任何寻找如何修复/解决此问题的人,请查看https://github.com/pypa/pip/issues/5221#issuecomment -382069604。

@pradyunsg在许多情况下,该评论中给出的解决方案将不起作用。 在新的 Ubuntu 17.10 下,运行pip install --upgrade pip :之后pip命令将被破坏,并且评论中的解决方案不会修复它。 他们不应该!

让系统安装了 pip 9 并且用户安装了 pip 10,使系统 pip 脚本尝试从用户 pip 10 导入 main(),但导入路径不正确。 Hash -r 或 -d 不会解决这个问题,因为默认情况下 pip 命令仍将运行系统 pip。 并且升级用户 pip 也不会修复它,因为系统 pip 仍为 9,用户 pip 仍为 10,因此导入将继续失败。

这些情况的解决方案必须是卸载两个 pip 之一。

  • python -m pip uninstall pip --user ,保留较旧的系统pip

或者

  • sudo apt remove python-pip并保留用户安装的 pip,默认情况下,在终端中运行pip将无法访问它。 您将需要使用python -m pip运行它,或者将路径添加到您的 PATH env var 等。

所有这些都适用于 python 2 和 3 下的 pip。

在我所有的 Ubuntu 系统 (16.04, 17.10. 18.04) 上,我有旧版本的系统 pip,用户使用 pip 10,我从来没有看到你的导入错误。
您确定您没有损坏的系统 pip 吗?

@gsemet您可能将~/.local/bin到您的 PATH 环境变量中(或者可能使用与默认 bash 不同的、更智能的 shell),因此当您运行pip它使用用户安装的 pip 10 脚本,而不是系统安装了 pip 9 脚本。 在 Ubuntu 中,默认情况下这不是那样的。 它可以做到,当然,我希望它在默认情况下是这样的。 但是默认情况下pip命令将调用系统安装的 pip,即使您有用户安装了一个。

如何在全新的 Ubuntu 17.10 安装下重现此问题,包括评论 5221 中的命令无法修复它的证据,以及我提出的确实修复了它。

安装两个 pips(系统和用户),这会破坏 pip 命令:

vfisa<strong i="7">@vilos</strong>:~$ sudo apt install python-pip
(...)

vfisa<strong i="8">@vilos</strong>:~$ pip --version
pip 9.0.1 from /usr/lib/python2.7/dist-packages (python 2.7)

vfisa<strong i="9">@vilos</strong>:~$ which pip
/usr/bin/pip

vfisa<strong i="10">@vilos</strong>:~$ pip install pip --upgrade --user
Collecting pip
  Downloading https://files.pythonhosted.org/packages/0f/74/ecd13431bcc456ed390b44c8a6e917c1820365cbebcb6a8974d1cd045ab4/pip-10.0.1-py2.py3-none-any.whl (1.3MB)
    100% |████████████████████████████████| 1.3MB 631kB/s 
Installing collected packages: pip
Successfully installed pip-10.0.1

vfisa<strong i="11">@vilos</strong>:~$ pip
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main

vfisa<strong i="12">@vilos</strong>:~$ python -m pip --version
pip 10.0.1 from /home/vfisa/.local/lib/python2.7/site-packages/pip (python 2.7)

vfisa<strong i="13">@vilos</strong>:~$ which pip
/usr/bin/pip

如您所见, pip命令默认指向系统pip,而不是用户安装的pip。

来自引用评论的命令,它们没有解决问题的证据:

vfisa<strong i="19">@vilos</strong>:~$ hash -r

vfisa<strong i="20">@vilos</strong>:~$ pip
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main

vfisa<strong i="21">@vilos</strong>:~$ hash -d
hits    command
   1    /usr/bin/pip

vfisa<strong i="22">@vilos</strong>:~$ pip
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main

vfisa<strong i="23">@vilos</strong>:~$ python -m pip install pip --force-reinstall --user
Collecting pip
  Using cached https://files.pythonhosted.org/packages/0f/74/ecd13431bcc456ed390b44c8a6e917c1820365cbebcb6a8974d1cd045ab4/pip-10.0.1-py2.py3-none-any.whl
Installing collected packages: pip
  Found existing installation: pip 10.0.1
    Uninstalling pip-10.0.1:
      Successfully uninstalled pip-10.0.1
Successfully installed pip-10.0.1

vfisa<strong i="24">@vilos</strong>:~$ pip
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main

vfisa<strong i="25">@vilos</strong>:~$ which pip
/usr/bin/pip

如您所见,只要安装了两个 pip 并且pip命令指向系统 pip(Ubuntu 中的默认行为),问题就会持续存在。

修复选项 1:

删除系统 pip,保留用户 pip,默认情况下无法通过pip命令访问(因此您需要使用python -m pip )。

vfisa<strong i="34">@vilos</strong>:~$ sudo apt remove python-pip
(...)

vfisa<strong i="35">@vilos</strong>:~$ pip
bash: /usr/bin/pip: No such file or directory

vfisa<strong i="36">@vilos</strong>:~$ python -m pip --version
pip 10.0.1 from /home/vfisa/.local/lib/python2.7/site-packages/pip (python 2.7)

您可以将~/.local/bin到您的 PATH 环境变量中,以便能够对用户 pip 使用pip命令。

修复选项 2:

删除用户 pip,保留系统 pip,它较旧,但默认情况下在路径中有一个有效的pip命令。

vfisa<strong i="45">@vilos</strong>:~$ python -m pip uninstall pip
Uninstalling pip-10.0.1:
  Would remove:
    /home/vfisa/.local/bin/pip
    /home/vfisa/.local/bin/pip2
    /home/vfisa/.local/bin/pip2.7
    /home/vfisa/.local/lib/python2.7/site-packages/pip-10.0.1.dist-info/*
    /home/vfisa/.local/lib/python2.7/site-packages/pip/*
Proceed (y/n)? y
  Successfully uninstalled pip-10.0.1
You are using pip version 9.0.1, however version 10.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

vfisa<strong i="46">@vilos</strong>:~$ pip --version
pip 9.0.1 from /usr/lib/python2.7/dist-packages (python 2.7)

@fisadev当然,这是支持用户可安装的“pip install --user”包所必需的。 但我认为应该告诉用户“如果你想在 debian/ubuntu 包更新之前强制更新到 pip 10,你需要使用pip install --user --upgrade pip并确保$HOME/.local/bin在你的路径中. 做起来很简单。

@gsemet我同意,应该告诉用户路径要求。 其他线程作为解决方案引用的评论中没有提到这一点,在一种情况下,即使在用户说他运行了这些命令并且没有解决问题之后,讨论也被锁定:/

@fisadev 非常感谢。 修复选项 1 确实有帮助。

@RonnyPfannschmidt

使用 pip 替换系统 pip 始终是一种系统破坏行为,造成它的人应对后果负责

是对精神破坏的评论。 好像进行(天真)升级的人是故意破坏他们自己的安装……如果是这样,那么 pip 本身不应该唠叨用户每次从 9.0.1 升级到 10.0.1执行了单个 pip 命令。 我本人遵循了该建议,结果陷入了混乱。

幸运的是:
sudo python -m pip install pip==9.0.1
是一个足够简单的补救措施。

然而,责备受害者是没有答案的。

嘿@rod-app!

如果是这种情况,那么 pip 本身不应该在执行每个 pip 命令时催促用户从 9.0.1 升级到 10.0.1。

我们已经注意到这一点,并与操作系统供应商合作,以避免在 pip 的未来版本中出现这种情况。 ——#5346。

为了解决这个问题,我跑了……

sudo geany -i /usr/bin/pip

...并编辑了 debian 提供的 /usr/bin/pip 以将其替换为 ...

#!/bin/sh
# GENERATED BY CEFN
python -m pip "$@"

和 /usr/bin/pip3 的等价物(注意这里调用的是 python3)。

#!/bin/sh
# GENERATED BY CEFN
python3 -m pip "$@"

...尽管我的站点包中安装了 10 版,但它仍带回了 pip 的全部功能。 我想这将与 debian 通过发送更新的 python-pip 包修复它(或重新破坏它)所需的时间完全相同。 为什么他们不首先使用包 main 我不知道。

正式版

下面显示的.local/bin/pip中安装的 pip 版本有点高级,并且包括一些替换以从传递的参数中删除 -script、.py、.pyw 和 .exe 扩展名,但我不知道那有什么作用或者为什么我需要它,所以为了简单起见,我把它留在上面。

#!/usr/bin/python

# -*- coding: utf-8 -*-
import re
import sys

from pip._internal import main

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(main())

我发现了这个 pip v10 问题的一个无关的原因。 当使用一个非常旧的系统 pip(Debian Jessie 上的 v1.5.6,即 oldstable)升级 pip 时 --system 是默认的,我注意到安装了不正确的脚本,例如/usr/local/bin/pip包含from pip import main - 我通过查看文件找到的。 我认为这是因为较旧的 pip(或者可能是它使用的安装包)错误地安装了 .whl 文件。

python -m pip install --force-reinstall pip修复了这个问题。

5599 提供信息并提供单一位置,以便为最终用户解决此问题寻求帮助。

该问题的评论部分是开放的,供用户讨论具体问题和解决方案。 :)

此页面是否有帮助?
0 / 5 - 0 等级