Pip: 在 pyenv 上进行 pip 10 升级后“ImportError: cannot import name 'main'”

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

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


  • 点子版本:10.0
  • Python版本:3.6.2
  • 操作系统:Ubuntu 16.04

描述:

在 pyenv 环境中通过pip install pip --user --upgrade将 pip 从 9.03 升级到 10.0 后,pip 拒绝启动并改为:

Traceback (most recent call last):
  File "/home/kleinernull/.pyenv/versions/3.6.2/bin/pip", line 7, in <module>
    from pip import main
ImportError: cannot import name 'main'
Traceback (most recent call last):
  File "/home/kleinernull/.pyenv/versions/3.6.2/bin/pip", line 7, in <module>
    from pip import main
ImportError: cannot import name 'main'

所有三个不同的 pip 文件的内容都是相同的:

~ ⟩ cat .pyenv/versions/3.6.2/bin/pip                                                                            ~
#!/home/kleinernull/.pyenv/versions/3.6.2/bin/python3.6

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

from pip._internal import main as _main

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

~ ⟩ cat .pyenv/versions/3.6.2/bin/pip3                                                                           ~
#!/home/kleinernull/.pyenv/versions/3.6.2/bin/python3.6


# -*- 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())

~ ⟩ cat .pyenv/versions/3.6.2/bin/pip3.6                                                                         ~
#!/home/kleinernull/.pyenv/versions/3.6.2/bin/python3.6

# -*- 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())

我的 3.6.1 环境也发生了同样的情况。

临时修复

根据主分支的代码,导入应该是:

#!/home/kleinernull/.pyenv/versions/3.6.2/bin/python3.6

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

from pip._internal import main as _main

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

这解决了这个问题。 我不知道这是否与升级本身或 pyenv 作为环境有关。

duplicate

最有用的评论

对我们的修复是固定到 pip 9.03,所以:

pip install --upgrade pip==9.0.3

代替

pip install -U pip

明显的修复,但以防它帮助别人!

所有68条评论

嘿@KleinerNull!

我不知道这是否与升级本身或 pyenv 作为环境有关。

我认为这是一个环境问题。 我建议您在 pyenv 上打开一个问题,因为我认为那里的人们会更好地对此发表评论/修复它。

@pradyunsg

我在 pyenv 存储库中打开了一个问题

我们也遭受了这一痛苦,它破坏了我们的管道。 正在运行的操作:

 11 #upgrade pip and install uwsgi
 12 pip install --user --upgrade pip
 13 pip install uwsgi

Ubuntu 16.04
Python3.6

我们遇到了同样的麻烦。

// in host
$ docker pull ubuntu:xenial
$ docker run --name pip-test --rm -it ubuntu:xenial bash

// in container
# apt update
# apt install -y python-dev python-pip
# pip install --upgrade pip
Collecting pip
  Downloading pip-10.0.0-py2.py3-none-any.whl (1.3MB)
    100% |################################| 1.3MB 865kB/s 
Installing collected packages: pip
  Found existing installation: pip 8.1.1
    Not uninstalling pip at /usr/lib/python2.7/dist-packages, outside environment /usr
Successfully installed pip-10.0.0
# pip install requests
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main

同样在这里.. 与@HayaoSuzuki完全相同的输出,我们不使用 pyenv

如果你在 pyenv 之外得到这个,我怀疑它更有可能与 #5221 有关

顺便提一下,Ubuntu 16.04 上的pip install --user --upgrade pip也会中断。

有趣的是容易安装 pip 安装 10.0.0 但没有出现问题
```
// 在主机中
$ docker pull ubuntu:xenial
$ docker run --name pip-test --rm -it ubuntu:xenial bash

// 在容器中

适当的更新

apt install -y python-setuptools

easy_install pip

安装 /usr/local/lib/python2.7/dist-packages/pip-10.0.0-py2.7.egg
处理 pip 的依赖项
pip 完成处理依赖

pip 安装请求

收集请求
下载 requests-2.18.4-py2.py3-none-any.whl (88kB)
100% |################################| 92kB 2.9MB/秒
收集证书>=2017.4.17(来自请求)
下载 certifi-2018.1.18-py2.py3-none-any.whl (151kB)
100% |################################| 153kB 4.4MB/秒
收集 chardet<3.1.0,>=3.0.2 (来自请求)
下载 chardet-3.0.4-py2.py3-none-any.whl (133kB)
100% |################################| 143kB 4.5MB/秒
收集 idna<2.7,>=2.5(来自请求)
下载 idna-2.6-py2.py3-none-any.whl (56kB)
100% |################################| 61kB 7.4MB/秒
收集 urllib3<1.23,>=1.21.1 (来自请求)
下载 urllib3-1.22-py2.py3-none-any.whl (132kB)
100% |################################| 133kB 4.4MB/秒
安装收集的包:certifi、chardet、idna、urllib3、requests
成功安装certifi-2018.1.18 chardet-3.0.4 idna-2.6 requests-2.18.4 url​​lib3-1.22
```

这并不奇怪,因为该 pip 安装在不同的位置,因此不再影响全局 pip - 这也意味着您现在有了一个非常有趣的 python 工作集

虽然我很欣赏这里和https://github.com/pypa/pip/issues/5221中报告的潜在问题是环境,但原因主要是导入from pip import main被破坏为包pip.main已移至pip._internal.main 。 添加从pip.mainpip._internal.main的链接来解决这个问题是微不足道的(而对于许多人来说,修复环境是许多地方的大量工作)。 有充分的理由不这样做吗?

@davidjlloyd

评论提供了一些关于不要这样做的信息,但我不完全确定这对 pip 脚本本身是否也很重要。 但是,它为我解决了这个问题。

@davidjlloyd因为from pip import main基本上从未受到支持。 虽然很容易说“是的,但它是一个简单的 API,而且它可以正常工作”,但实际上并没有——我们收到了多个错误报告,这些错误报告来自人们期待它的某些行为,而我们根本不满足(在多个线程中运行pip.main ,期望pip.main不会更改日志系统的配置,...)

我们没有继续向人们解释他们不应该这样做,而是不断处理人们假设“如果我能找到要调用的函数,它就受支持”这一事实,我们将所有内容都移到了_internal命名空间非常清楚地表明您不应该调用它。

大部分投诉来自使用pip.main的人 - 这很讽刺,因为通过subprocess以支持的命令行方式调用 pip非常容易。 因此,在所有可能的损坏中,这是最容易修复的——但即使经过数月的警告,人们仍然没有修复它。 (尽管为了公平起见,Linux 发行版不支持人们使用 pip 升级他们的系统包,所以像 #5221 这样关于发行版提供的脚本中断的情况的报告基本上是用户错误,而不是发行版未能解决 pip 10 个变化——我确信他们处理得很好)。

我还可以确认,这个问题绝对破坏了我之前非常稳定的构建 docker 映像的过程,以下是我在 docker 映像构建过程中所做的最小示例:

+ pip install -U pip setuptools
Collecting pip
  Downloading https://files.pythonhosted.org/packages/62/a1/0d452b6901b0157a0134fd27ba89bf95a857fbda64ba52e1ca2cf61d8412/pip-10.0.0-py2.py3-none-any.whl (1.3MB)
Collecting setuptools
  Downloading https://files.pythonhosted.org/packages/20/d7/04a0b689d3035143e2ff288f4b9ee4bf6ed80585cc121c90bfd85a1a8c2e/setuptools-39.0.1-py2.py3-none-any.whl (569kB)
Installing collected packages: pip, setuptools
  Found existing installation: pip 8.1.1
    Not uninstalling pip at /usr/lib/python2.7/dist-packages, outside environment /usr
Successfully installed pip-10.0.0 setuptools-39.0.1

...

+ pip install jupyter opencv-python plyfile pandas
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main

对我们的修复是固定到 pip 9.03,所以:

pip install --upgrade pip==9.0.3

代替

pip install -U pip

明显的修复,但以防它帮助别人!

@peteflorence所以大概在运行docker时,您正在创建一个基本映像,然后在该映像中以root身份运行pip install -U pip setuptools ? 如果您正在做的只是安装其他软件包,那么您是否有理由需要最新的 pip/setuptools? 您不能简单地升级到作为发行包提供的最新 pip/setuptools 吗?

我很欣赏这对您来说是个问题——与您在普通操作系统中相比,docker 构建似乎更倾向于以 root 身份执行操作(可能是因为 docker 映像是隔离的)。 但是这样做仍然不是一个好主意。 问题是 pip 不管理/usr/bin/pip ,因此我们无法“修复”它以与 pip 10 一起使用。

您可以做的是从使用/usr/bin/pip切换到使用python -m pip 。 它仍然不受支持,并且可能会遇到其他问题(我不知道您的基本操作系统供应商可能对系统 pip 进行了哪些更改),但它会避免/usr/bin/pip中的问题,而您可以整理更长的时间-您的问题的长期解决方案。

固定到 pip 9 也是一种解决方案,但这引出了一个问题,如果 pip 9 没问题,为什么还要升级你的操作系统 pip? 您的供应商是否不提供 pip 9 的打包版本?

我们没有继续向人们解释他们不应该这样做,而是不断处理人们假设“如果我能找到要调用的函数,它就受支持”这一事实,我们将所有内容都移到了 _internal 命名空间,以使其非常清楚你不应该打电话给它。

我不确定积极打破对不受支持的功能的现有使用,而不是在几个主要版本中弃用该功能是最好的方法。 我们最初的反应是将 pip 固定回 9.0.3,而更多懒惰的开发人员可能会在那个时候收工。 这会让很多用户顽固地坚持旧版本,我怀疑有人想要。 然而,你的动机是有道理的,最终的结果是一样的。

对于遇到此问题的任何用户,我认为@standag在这里提供了替换系统或 pyenv 安装的最佳解决方案: https ://github.com/pypa/pip/issues/5221#issuecomment -381568428

这个解决方案应该适用于任何在 Docker 中构建的人,例如@peteflorence ,而不需要固定到过时的版本或任何类似的可怕东西。

临时修复升级 pip 使用。

curl https://bootstrap.pypa.io/get-pip.py | python3

而不是pip install -U pip

对于 pip2 pip2 install --upgrade pip

我用pyenv升级了python2和python3,现在pip2不工作而pip3工作
对比pip2和pip3后,不同的是导入线

点子2
from pip import main

点子3
from pip._internal import main

用 pip3 版本替换 pip2 导入行后,它可以工作

遇到同样的问题,呵呵。

同样的问题,但通过解决方案解决: https ://github.com/pypa/pip/issues/5240#issuecomment -381673100

同样的问题:

+ pip install --upgrade pip
Collecting pip
  Downloading https://files.pythonhosted.org/packages/62/a1/0d452b6901b0157a0134fd27ba89bf95a857fbda64ba52e1ca2cf61d8412/pip-10.0.0-py2.py3-none-any.whl
 (1.3MB)
Installing collected packages: pip
  Found existing installation: pip 8.1.1
    Not uninstalling pip at /usr/lib/python2.7/dist-packages, outside environment /usr
Successfully installed pip-10.0.0
+ pip install awscli requests simplejson
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main

现在很奇怪,它将 pip 10 安装到 /usr/local/bin 中,并且它首先在 /usr/bin 之前的 PATH 中,但它不使用它,直到你进入一个新的 shell。 当我去这个盒子尝试手动安装更新的 awscli 时,我看到了这种情况......

$ python --version
Python 2.7.12
$ pip --version
pip 10.0.0 from /usr/local/lib/python2.7/dist-packages/pip (python 2.7)
$ sudo pip install --upgrade awscli 
 <blah blah>
$ aws --version
aws-cli/1.11.13 Python/3.5.2 Linux/4.4.0-1049-aws botocore/1.4.70
$ /usr/local/bin/aws --version
aws-cli/1.15.4 Python/2.7.12 Linux/4.4.0-1049-aws botocore/1.10.4
$ which aws
/usr/local/bin/aws
$ echo $PATH
/home/ec2-user/bin:/home/ec2-user/.local/bin:/opt/bamboo-elastic-agent/bin:/opt/jdk-8/bin:/opt/maven-2.1/bin:/opt/maven-1.0.2/bin:/opt/ant-1.9/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/bin:/bin:/opt/puppetlabs/bin

@pfmoore感谢您的评论。 是的,我们的 docker 镜像显然需要 pip 9,我们继承自 nvidia cuda 8.0 docker 镜像和一堆其他必须没有的东西。 Pinning 对我们来说是一个很好的解决方案——这是一个研究系统,我们希望合理地锁定代码。 但是是的,对于许多其他人来说,显然你需要一个能够让你与 pip 10 兼容的解决方案

现在很奇怪,它将 pip 10 安装到 /usr/local/bin

我不是 Unix 用户,但我记得看到有人谈论 shell 中的“重新散列”? 这可能是问题吗? bash 是否缓存路径查找并需要提示重做路径搜索?

是的,我们的 docker 镜像显然需要 pip 9 ...

酷 - 当然固定到 pip 9 在您的情况下是一个合理的解决方案。 对于让“仅固定到 pip 9”的建议不受质疑,我有点紧张,因为人们有可能看到它们并盲目地复制它们,只是推迟了他们需要修复环境的时刻。 但当然要考虑您的要求并确定固定对您有用。 因此,很抱歉将您的评论用作肥皂盒:-)

我们固定到 pip 9 并“修复”了我们,但我们当然对能够在某些时候使用 pip 10 感兴趣。

尝试使用 pip2 install xx @HayaoSuzuki

如何回到 pip 9.0.0 ..
它仍然向我显示相同的错误。 请写下所有步骤

@swtt123你可以试试pip install pip==9.0.1

pip 10.0,我也面临

AttributeError: 'module' object has no attribute 'main'

在尝试使用pip.main(['install', '-r', 'requirements.txt'])

@p00j4不支持从您的程序中导入 pip - 请参阅文档

哦! 但是我明白了,现在被迫改变了很多地方。
感谢@pfmoore的负责人。

注意 bash 缓存可执行位置:

$ which pip
/usr/bin/pip

$ pip install --user pip
Collecting pip
(...)
Successfully installed pip-10.0.0

$ pip
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main

$ which pip
/usr/bin/pip

$ hash -d pip  # this clears the 'pip' entry from bash's executables locations hash table

$ which pip
/home/zwinny/.local/bin/pip

$ pip --version
pip 10.0.0 from /home/zwinny/.local/lib/python2.7/site-packages/pip (python 2.7)

我在 Raspberry Pi 3B+ 上创建了一个新的 Raspbian 安装。 没有什么特别的——漂亮的香草配置——到目前为止,一切都很好。

我刚刚到达安装过程的最后一步:

pip install --upgrade pip

Collecting pip
  Downloading https://files.pythonhosted.org/packages/62/a1/0d452b6901b0157a0134fd27ba89bf95a857fbda64ba52e1ca2cf61d8412/pip-10.0.0-py2.py3-none-any.whl (1.3MB)
    100% |████████████████████████████████| 1.3MB 101kB/s 
Installing collected packages: pip
Successfully installed pip-10.0.0

...现在 pip 完全无聊:

$ pip
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main

根据上面的评论,我已经确认 ~i/.local/bin/pip 运行良好。 /usr/bin/pip 发生错误。 但是,运行 hash -d pip 并没有更新缓存的位置。

强制降级到 9.0.1(通过选项行 -Iv 和 --force-reinstall)也没有解决问题。 显然,除了不升级 pip 之外,唯一的解决方案是从 ~/.local/bin/pip 运行 pip。

python -m pip install --upgrade pip 

为我工作。 我希望这对某人有所帮助。

我今天安装了一个新的 Ubuntu 发行版,并尝试启动并运行一些基本的 Python 包。 我被提示升级 pip,所以我运行了它告诉我的命令。 这个升级的 pip 到版本 10,显然在这个线程的顶部出现了同样的错误。 除了普通用户升级 pip 和安装他们喜欢的软件包之外,我没有做任何其他事情。 甚至不使用 pyenv。

这里的解决方案都不能解决我的问题。 如果我运行python -m pip install --upgrade pip我会得到“要求已经是最新的”。 如果我尝试降级到版本 9,我会收到相同的初始错误:

Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main

重新阅读此线程后, @sfsdfd使用~/.local/bin/pip的解决方案终于奏效了:

~/.local/bin/pip install my-favourite-package

显然,这是通过(成功地)恢复到我的旧版本 pip 来工作的。 将此添加到~/.bashrc对我来说是一个更好的修复:

export PATH=$PATH:~/.local/bin

只需重新启动我的终端即可为我修复它。

我通过更新/usr/bin/pip中的代码解决了这个问题,将from pip import main更改为from pip._internal import main

这里详细介绍:

$ dpkg -S /usr/bin/pip
python-pip: /usr/bin/pip
$ dpkg -S /usr/bin/pip2
python-pip: /usr/bin/pip2
$ apt-file search /usr/bin/pip
colorized-logs: /usr/bin/pipetty
pipebench: /usr/bin/pipebench
pipemeter: /usr/bin/pipemeter
pipexec: /usr/bin/pipexec
python-pip: /usr/bin/pip
python-pip: /usr/bin/pip2
python3-pip: /usr/bin/pip3
rt-tests: /usr/bin/pip_stress

pip install --upgrade pip之后:

$ pip
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main
$ pip2
Traceback (most recent call last):
  File "/usr/bin/pip2", line 9, in <module>
    from pip import main
ImportError: cannot import name main

$ cat /usr/bin/pip
#!/usr/bin/python
# 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())

更新/usr/bin/pip后:

$ cat /usr/bin/pip
#!/usr/bin/python
# 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
from pip._internal import main
if __name__ == '__main__':
    sys.exit(main())

$ pip --version
pip 10.0.0 from /home/devops/.local/lib/python2.7/site-packages/pip (python 2.7)

$ pip2
Traceback (most recent call last):
  File "/usr/bin/pip2", line 9, in <module>
    from pip import main
ImportError: cannot import name main

我的系统信息:

$ uname -a
Linux devops-kubernetes-master 4.13.0-38-generic #43-Ubuntu SMP Wed Mar 14 15:20:44 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=17.10
DISTRIB_CODENAME=artful
DISTRIB_DESCRIPTION="Ubuntu 17.10"
NAME="Ubuntu"
VERSION="17.10 (Artful Aardvark)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 17.10"
VERSION_ID="17.10"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=artful
UBUNTU_CODENAME=artful

$ python --version
Python 2.7.14

$ apt list --installed | grep python-

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

libpython-all-dev/artful,now 2.7.14-2ubuntu1 amd64 [installed]
libpython-dev/artful,now 2.7.14-2ubuntu1 amd64 [installed,automatic]
libpython-stdlib/artful,now 2.7.14-2ubuntu1 amd64 [installed,automatic]
python-all/artful,now 2.7.14-2ubuntu1 amd64 [installed,automatic]
python-all-dev/artful,now 2.7.14-2ubuntu1 amd64 [installed,automatic]
python-apt-common/artful,artful,now 1.4.0~beta3build2 all [installed]
python-asn1crypto/artful,artful,now 0.22.0-1 all [installed,automatic]
python-cffi-backend/artful,now 1.9.1-2build2 amd64 [installed,automatic]
python-crypto/artful-updates,artful-security,now 2.6.1-7ubuntu0.1 amd64 [installed,automatic]
python-cryptography/artful,now 1.9-1 amd64 [installed,automatic]
python-dbus/artful,now 1.2.4-1build3 amd64 [installed,automatic]
python-dev/artful,now 2.7.14-2ubuntu1 amd64 [installed,automatic]
python-enum34/artful,artful,now 1.1.6-1 all [installed,automatic]
python-gi/artful,now 3.24.1-2build1 amd64 [installed,automatic]
python-idna/artful,artful,now 2.5-1 all [installed,automatic]
python-ipaddress/artful,artful,now 1.0.17-1 all [installed,automatic]
python-keyring/artful,artful,now 10.4.0-1 all [installed,automatic]
python-keyrings.alt/artful,artful,now 2.2-2 all [installed,automatic]
python-minimal/artful,now 2.7.14-2ubuntu1 amd64 [installed,automatic]
python-pip/artful,artful,now 9.0.1-2 all [installed]
python-pip-whl/artful,artful,now 9.0.1-2 all [installed,automatic]
python-pkg-resources/artful,artful,now 36.2.7-2 all [installed,automatic]
python-secretstorage/artful,artful,now 2.3.1-2 all [installed,automatic]
python-setuptools/artful,artful,now 36.2.7-2 all [installed,automatic]
python-setuptools-doc/artful,artful,now 36.2.7-2 all [installed]
python-six/artful,artful,now 1.10.0-4 all [installed,automatic]
python-talloc/artful,now 2.1.9-2ubuntu1 amd64 [installed]
python-wheel/artful,artful,now 0.29.0-2 all [installed,automatic]
python-xdg/artful,artful,now 0.25-4 all [installed,automatic]

我是这样解决的:

$点子--版本
回溯(最近一次通话最后):
文件“/usr/bin/pip”,第 9 行,在
从点进口主要
ImportError:无法导入名称 main
$ sudo apt-get 删除 python-pip
$ sudo apt-get 安装 python-pip
$点子--版本
来自 /home/user/.local/lib/python2.7/site-packages/pip 的 pip 10.0.0 (python 2.7)

我希望这对某人有所帮助。

即使遵循了一切,我也无法降级 pip。 不断出错。
这是我解决这个问题的方法:

$ sudo apt-get 删除 python-pip
$点-v
bash: /usr/bin/pip: 没有这样的文件或目录

但是当我尝试这个时$ python -m pip -V来自 /home/user/.local/lib/python2.7/site-packages/pip 的 pip 10.0.0 (python 2.7)

所以我删除了 pip 的完整文件夹
$ sudo rm -r /home/user/.local/lib/python2.7/site-packages/pip*

然后我再试一次
$ python -m pip -V
/usr/bin/pip: 没有名为 pip 的模块

然后再次安装 pip
$ sudo apt install python-pip
$ python -m pip -V
来自 usr/lib/python2.7/dist-packages 的 pip 8.1.1 (python 2.7)

希望这能解决问题

浪费了 3 个小时后,这就是我得到的

卸载 pip 10.0.0:
sudo apt-get 删除 python-pip

但是您将无法通过直接方法安装正确的所需版本的 pip。

安装后降级到已知的工作版本
当 pip10 抛出错误时: ImportError: cannot import name main
你将不得不运行:
python -m pip install pip==KNOW_WORKING_VERSION>

使用 PIP10 安装任何软件包:
sudo python -m pip install PACKAGE_NAME
这行得通。

干杯:)

同样的问题,修复问题:完全重新安装:python-pip

只需按照此处提到的重新登录 shell
https://github.com/pypa/pip/issues/5240#issuecomment -382262586

pip3 install --upgrade pip==9.0.3
Traceback (most recent call last):
  File "/usr/bin/pip3", line 9, in <module>
    from pip import main
ImportError: cannot import name 'main'

呵呵……我除了……

我刚刚展开了我的 pip 安装。
python -m pip install --user --upgrade pip==9.0.3

我想报告这个问题在使用 AppVeyor for CI 时也发生在 Windows 构建上:
结果如下:

Running Install scripts
SET PATH=%PYTHON%;%PYTHON%\Scripts;%PATH%
pip install --disable-pip-version-check --user --upgrade pip
Collecting pip
  Downloading https://files.pythonhosted.org/packages/0f/74/ecd13431bcc456ed390b44c8a6e917c1820365cbebcb6a8974d1cd045ab4/pip-10.0.1-py2.py3-none-any.whl (1.3MB)
Installing collected packages: pip
Successfully installed pip-10.0.1
pip install -U setuptools
Traceback (most recent call last):
  File "c:\python27-x64\lib\runpy.py", line 174, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "c:\python27-x64\lib\runpy.py", line 72, in _run_code
    exec code in run_globals
  File "C:\Python27-x64\Scripts\pip.exe\__main__.py", line 5, in <module>
ImportError: cannot import name main
Command exited with code 1

我有: pip install --disable-pip-version-check --user --upgrade pip在几个appveyor.yml脚本中,基于此示例的建议: https ://github.com/ogrisel/python-appveyor-demo/blob/master/appveyor.yml

这在 pip 10.x 之前一直运行良好,我怀疑其他人是否基于此创建了appveyor.yml也会遇到这个问题。

切换到easy_install -U pip有效,但我确实有几个在此之前有效的存储库现在需要更新以与 pip 10.x 一起使用。

似乎 CI 设置的推荐方法应该坚持使用 9.0.3 或使用 easy_install。

似乎 CI 设置的推荐方法应该坚持使用 9.0.3 或使用 easy_install。

推荐的方法是从 pip 的内部实现细节中删除对库/应用程序/工具的依赖。 easy_install 不再积极改进 AFAIK 并且可能不支持 pip 所做的很多事情。

至于您的具体问题,您可以通过运行python -m pip install --force-reinstall pip来修复它,以修复损坏的脚本。 如果没有,请提交一个新问题。

推荐的方法是从 pip 的内部实现细节中删除对库/应用程序/工具的依赖。 easy_install 不再积极改进 AFAIK 并且可能不支持 pip 所做的很多事情。

我猜你没有读过他的帖子的其余部分。 他指的是使用 easy_install 安装 pip,而不是代替 pip:

切换到 easy_install -U pip 工作...

他也不依赖 pip 的内部实现细节。 他正在使用 AppVeyor 的新版本并使用他指定的命令升级 pip,仅此而已:

pip install --disable-pip-version-check --user --upgrade pip

此线程中的许多其他人都遇到了同样的问题。 您可以通过 pip 的基本安装来重现这一点,而无需做任何特殊的事情或依赖于 pip 的内部结构。 许多人在上面的帖子中记录了这一点。

@ikreymer您似乎指的是在运行Windows 的Appveyor 上的问题。 这里讨论的问题与pyenv有关,它是一个专门的 Unix 实用程序。

我不知道@pradyunsg ,但我越来越困惑正在讨论的各种问题是什么。 根本原因很简单——pip(故意)移动了内部 API,这给那些依赖直接或间接使用它们的工具的人带来了问题。 但这不会改变。 因此,如果我们要帮助用户找到他们特定问题的解决方案,我们需要一次将讨论集中在一个问题上。

所以我可以问一下 - 如果您在 Appveyor 上遇到问题需要帮助,请您打开一个描述该问题的问题,我们将把讨论转移到那里。 (大部分细节可能在您的评论中,因此这将作为问题的起点,但是关于如何在全新的 Appveyor 项目中重现问题的完整描述对于帮助我们诊断问题非常有用.

@arvoelke

他指的是使用easy_install安装pip,而不是代替pip

使用easy_install安装 pip 很可能会出现问题,如果确实如此,我们将无法为您提供支持,因为(正如@pradyunsg所说) easy_install很旧,没有积极维护,并且缺少最近的功能。 但是,如果它对您有用,并且您不需要我们的帮助,那很好 - 没有人阻止您。

此线程中的许多其他人都遇到了同样的问题

定义“相同”。 如果您的意思是“从导入pip.main的代码中看到错误,那么是的,但这不是 pip 的问题,这是对 pip 的内部实现的蓄意的、向后不兼容的更改。如果您想让我们说“很难,你不应该使用 pip 的内部 API”,那么很好 - 一个问题就足够了,我们将把它作为“不是错误”来关闭。但是如果你想让我们帮助你解决什么问题您的部分环境未能遵循 6 个月前发布的建议,并为您找到一种解决方法,让您在供应商修复您的环境时继续使用 pip,那么您将不得不帮助我们来帮助您。在关于纯 Unix 实用程序的报告中说“我有同样的问题”,当您在 Windows 上运行时,绝对不会帮助我们帮助您...

这里讨论的问题与 pyenv 有关,它是一个专门的 Unix 实用程序。

对该线程的第一个回复是:

同样在这里.. 与@HayaoSuzuki完全相同的输出,我们不使用 pyenv

基于上述评论和链接的问题和提交,pyenv 方面似乎或多或少是次要的,包括在全新安装的 Ubuntu 和 RaspberryPi 上发生的问题。 同样,所有这些已经是这个问题的一部分。 根本原因对于每个人(包括 OP)来说都是“相同的”(即升级 pip 然后尝试启动它),因此我们可以创建更多问题,但它们之间实际上并没有什么不同——仅在问题如何体现。

当你在 Windows 上运行时,在关于纯 Unix 实用程序的报告中说“我有同样的问题”,绝对不能帮助我们帮助你......

我没有在 Windows 上运行。 正如我之前所说,我在 Ubuntu 上运行。 另一张海报使用的是 Windows,但他们只是升级 pip 并运行 pip,就像我们在本期中的其他人一样。 有一个非常普遍的共识,即使用 pyenv 不是问题的基础。

所有这些问题似乎都源于同一个问题:升级 pip,但继续使用仍然使用旧入口点的旧启动器。 避免此类问题的一个好方法是使用python -m pip

所有这些问题似乎都源于同一个问题:升级 pip,但继续使用仍然使用旧入口点的旧启动器。 避免此类问题的一个好方法是使用 python -m pip。

是的,我认为这似乎是问题的根源,并且发生在该线程中提到的所有不同平台上,包括 Windows。

如果这对其他人有帮助,我可以确认从以下位置切换appveyor.yml pip 升级:

pip install --disable-pip-version-check --user --upgrade pip

到:

python -m pip install --upgrade pip

确实解决了这个问题。 现在更新更多的回购!

我在不同的情况下遇到了这里讨论的相同症状。

我试图在 Ubuntu 16.0.4 系统上使用本地安装的 pip:

curl -O https://bootstrap.pypa.io/get-pip.py
export PYTHONUSERBASE=$(pwd)
python ./get-pip.py --user
export PYTHONPATH=$(pwd)/lib/python2.7/site-packages

python ./bin/pip --version

Traceback (most recent call last):
  File "/path/to/bin/pip", line 7, in <module>
    from pip._internal import main
ImportError: No module named _internal

事实证明,Ubuntu 通过site.pysys.path预先添加了一个 pip 特定的路径,它覆盖了我的PYTHONPATH ,如下所示:

import sys
print(sys.path)
['', '/usr/local/lib/python2.7/dist-packages/pip-9.0.1-py2.7.egg', '/path/to/lib/python2.7/site-packages`, ...]

我尝试避免为 python 使用-S标志,在手册页中记录为:

-S禁用模块站点的导入以及它需要的 sys.path 的站点相关操作。

它奏效了:

python -S ./bin/pip --version

pip 10.0.1 from path/to/bin/pip (python 2.7)

分享以防万一这可能对其他人有所帮助 - 在我的docker 映像(基础是ubuntu:xenial )中,我收到以下错误:

Step 8/12 : RUN pip install -U pip  && pip install -r /tmp/requirements.txt
 ---> Running in e4ff51b013f0
Collecting pip
  Downloading https://files.pythonhosted.org/packages/0f/74/ecd13431bcc456ed390b44c8a6e917c1820365cbebcb6a8974d1cd045ab4/pip-10.0.1-py2.py3-none-any.whl (1.3MB)
Installing collected packages: pip
  Found existing installation: pip 8.1.1
    Not uninstalling pip at /usr/lib/python2.7/dist-packages, outside environment /usr
Successfully installed pip-10.0.1
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    from pip import main
ImportError: cannot import name main

我将pip install -U pip && pip install -r /tmp/requirements.txt更改为pip2 install -U pip && pip2 install -r /tmp/requirements.txt 。 这解决了这个问题。

我不确定我是否看到了对@davidjlloyd评论的回答/回复:

我不确定积极打破对不受支持的功能的现有使用,而不是在几个主要版本中弃用该功能是最好的方法。

我能问一下为什么没有为此制定弃用流程吗?
看起来这很容易,在 $ pipimport上,检查sys.argv[0] ; 如果不是pippipX[.Y] ,请喷出一些DeprecationWarning s,这将在 X+ 版中失败,并附上您提到的链接: https://pip.pypa。 io/en/latest/user_guide/#using -pip-from-your-program

是否有适当的流程来尝试确保将来有望避免此类事情?

我不确定我是否看到了对@davidjlloyd评论的回答/回复:

已经多次回答,也许不是关于这个特定的问题,但是搜索问题跟踪器应该会找到很多关于这个问题的讨论。

我能问一下为什么没有为此制定弃用流程吗?

因为它从来没有被支持过。 为什么我们会警告说我们正在取消对我们从未支持过的东西的支持? 人们认为阅读 pip 的源代码并使用他们在自己的代码中找到的函数是可以的。 从来没有。 我们说它可能会破裂,而在 pip 10 中它确实会破裂。

似乎很容易,在 pip 的导入上,检查 sys.argv[0]; 如果不是 pip 或 pipX[.Y],请发出一些 DeprecationWarnings

我不确定它是否像你想象的那么容易。 我说,从不得不处理 pip 10 中添加的警告的问题的角度来看,当我们没想到它们会被触发时……

再说一次,没有必要弃用一开始就不支持的东西。

是否有适当的流程来尝试确保将来有望避免此类事情?

什么样的事情? 由于我们更改了我们不保证向后兼容性的东西而导致的损坏? 不,我们没有必要避免这种情况。 尽管事实上,我们确实尝试管理流程,作为对我们用户的礼貌(不是义务!)。 在这种情况下,我们提前 6 个月公布了更改,为需要更改代码的人提供了建议,并且自发布以来一直花费大量时间帮助因依赖的软件没有注意而遇到问题的用户那些警告。 这是一个非常小的志愿者团体投入的大量工作,试图缓解人们期望从未提供或承诺的支持而造成的情况。 不客气。

我们确实有流程(弃用警告等)来更改我们保证兼容性的东西 - 但将 pip 导入您自己的程序不是其中之一。

我有一个 bash 脚本,它安装了烧瓶并请求升级破坏了我的脚本,但我确实理解上述原因。 我为保持脚本正常工作而进行的工作是简单地启动一个新的 bash 进程,这可能是错误的,但它对我有用。 希望它可以帮助其他人使用类似的脚本。

pip install --upgrade pip
echo "pip install Flask" | bash
echo "pip install requests" | bash

@OneLogicalMyth您正在寻找的可能是hash -d pip ,请参阅https://github.com/pypa/pip/issues/5221#issuecomment -381568428。

即使仔细阅读后也完全错过了,谢谢@austinbutler这已经解决了我的问题。

这个问题保持开放而不是立即作为副本关闭的唯一原因是因为我担心 pyenv 是否对 shims 做了某些事情以及 pip 是否需要以某种方式提供帮助。 事实并非如此,这个问题现在已经结束了。

对于这里提到的几乎所有这些问题,我之前已经列出了解决方法(所有这些都是微不足道的)——看看https://github.com/pypa/pip/issues/5221#issuecomment -382069604。 希望这可以解决此问题中提出的所有问题。 如果没有,请打开一个新问题。

@benoit-pierre 我在链接的评论中添加了您使用python -m pip的建议。 感谢那。 :)


使用 easy_install 安装 pip 很可能会出现问题,如果确实如此,我们将无法为您提供支持,因为(正如@pradyunsg所说)easy_install 很旧,没有得到积极维护,并且缺少最新功能。

感谢您澄清我的立场@pfmoore。 这就是我所说的。

对于正在讨论的各种问题,我越来越感到困惑。

我也是。


关于我在本期中看到的一些一般提示(接受或放弃):

  • 如果pip命令由于某种原因不起作用,请尝试运行python -m pip 。 即使您的包装脚本损坏, python -m pip也可能对您有用。 如果它不起作用,请打开一个新问题。
  • 不要以 root 身份运行 pip 或执行sudo pip 。 你可能会破坏你的系统,如果这还不够糟糕,你正在以 root 身份执行远程代码。
  • 不要使用 easy_install ,因为此评论顶部引用了原因。 这里有更多的上下文(这有点过时了)。
  • 请不要固定到 pip 9。我坚信这样做是在积极地减缓 Python 打包的总体进展。

    • pip 9 永远不会支持 PEP 517/518 并且停留在 pip 9 意味着您将不得不费力地在以后切换,因为它们会在最后一分钟损坏,因为它们会切换到更新的包装标准。


总而言之,这可能不是单个项目/个人的错,每个人都有充分的理由采取行动。 是的,你的环境坏了。 我们明白。 不要责怪那些自愿提供空闲时间的人,现在可以帮助您并开发点子。

想帮助我们吗? https://donate.pypi.org是一个东西,如果不是,那不是你的类型,这个问题跟踪器中有很多未解决的问题,你可以帮助我们解决。

我现在要退出这个问题。

好的,最后一件事,如果有人仍然想讨论我们决定将所有代码库移动到pip._internal的决定,请打开一个新问题并给我一个提及。 我会花一些时间写一些带有链接的东西,以及为什么 pip 这样做。 这样,@pypa/pip-committers 将有一个地方供人们链接到该主题。

目前,这适用于python3 / pip3 ,以将其回滚

python3 -m pip install --user --upgrade pip==9.0.3

@freckletonj请不要告诉人们恢复到 pip 9。这不是您应该解决此问题的方式。 还有很多更好的方法。

我已经链接到您上面的评论,列出了解决此问题的方法。

抱歉@pradyunsg ,但这仍然不起作用:

$ pip3 install --upgrade --user pip
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 9.0.3
    Uninstalling pip-9.0.3:
      Successfully uninstalled pip-9.0.3
Successfully installed pip-10.0.1
$ pip3
Traceback (most recent call last):
  File "/usr/local/bin/pip3", line 7, in <module>
    from pip import main
ImportError: cannot import name 'main'

来自https://github.com/pypa/pip/issues/5221#issuecomment -382069604,我已经链接到上面:

hash -r pip # or hash -d pip

如果有人有任何其他疑问,请打开一个新问题。

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

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

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