Python Pip 被 sys.stderr.write(f"ERROR: {exc}") 破坏

onk*_*ows 98 python pip

在使用 box bento/centos-7 的新 Vagrant VM 上,以下命令破坏了我的 pip 安装:

yum update
yum install epel-release -y
yum install python-pip -y
/usr/bin/pip2 install --upgrade pip setuptools pyOpenSSL psycopg2-binary lxml
Run Code Online (Sandbox Code Playgroud)

这最终失败了

  Downloading https://files.pythonhosted.org/packages/84/48/5c99d8770fd0a9eb0f82654c3294aad6d0ba9f8600638c2e2ad74f2c5d52/setuptools-52.0.0.tar.gz (2.1MB)
    100% |????????????????????????????????| 2.1MB 821kB/s
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "setuptools/__init__.py", line 16, in <module>
        import setuptools.version
      File "setuptools/version.py", line 1, in <module>
        import pkg_resources
      File "pkg_resources/__init__.py", line 1367
        raise SyntaxError(e) from e
                                ^
    SyntaxError: invalid syntax

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-GZrC3W/setuptools/
You are using pip version 8.1.2, however version 21.0 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Run Code Online (Sandbox Code Playgroud)

如果我然后升级 Pip,我会注意到我的 Python 坏了。之后所有 pip 命令都以SyntaxError

[root@bkd-openam ~]# pip install --upgrade pip
Collecting pip
  Using cached https://files.pythonhosted.org/packages/9e/24/bc928987f35dd0167f21b13a1777c21b9c5917c9894cff93f1c1a6cb8f3b/pip-21.0.tar.gz
Installing collected packages: pip
  Found existing installation: pip 8.1.2
    Uninstalling pip-8.1.2:
      Successfully uninstalled pip-8.1.2
  Running setup.py install for pip ... done
Successfully installed pip-21.0
[root@bkd-openam ~]# /usr/bin/pip2 install --upgrade pip setuptools pyOpenSSL psycopg2-binary lxml
Traceback (most recent call last):
  File "/usr/bin/pip2", line 9, in <module>
    load_entry_point('pip==21.0', 'console_scripts', 'pip2')()
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 378, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2566, in load_entry_point
    return ep.load()
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2260, in load
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
  File "/usr/lib/python2.7/site-packages/pip/_internal/cli/main.py", line 60
    sys.stderr.write(f"ERROR: {exc}")
                                   ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

为什么是这样?这是 Python 的已知问题吗?我该如何解决?

顺便说一句,CentOS 7 是给定的,此时我们无法升级到 CentOS 8。此外,我们正在使用 Ansible,因此我认为 Ansible 社区建议不要将 virtualenv 用于目标节点。

我们当然可以在目标节点上安装 Python 3,但并非所有 Ansible 代码都可用于将 Python 3 与 CentOS 7 组合。

我们可以使用 Pip 20 吗?我们想升级到仍然有效的 Pip 的最新版本,我认为那是 Pip 20。如何阻止升级到 Pip 21?

bas*_*ker 54

您可以获得 get-pip.py 的旧版本 (2.7)

curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py
Run Code Online (Sandbox Code Playgroud)

在我看来,你应该创建一个 python2 virtualenv 并在其中安装你的 python2 包,以及 pip2。比如我安装布谷鸟沙箱的时候,我是这样操作的:

virtualenv --python=python2 cuckoo/   # make your virtualenv folder with python2
cd cuckoo
source bin/activate
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py   # get pip for python2
python2 get-pip.py        # install pip in your virtualenv
pip install cuckoo       # install your python2 package
Run Code Online (Sandbox Code Playgroud)

希望它会有所帮助。

  • 上面的curl命令已更改为curl https://bootstrap.pypa.io/pip/2.7/get-pip.py --output get-pip.py (2认同)

onk*_*ows 41

这个问题与 Python 2.7 的生命周期结束以及 PIP 社区本月停止支持这一事实有关。

PIP 显示弃用通知,例如

弃用:Python 2.7 的生命周期已于 2020 年 1 月 1 日结束。请升级您的 Python,因为 Python 2.7 不再维护。pip 21.0 将于 2021 年 1 月停止支持 Python 2.7。有关 pip 中 Python 2 支持的更多详细信息,访问 https://pip.pypa.io/en/latest/development/release-process/#python-2-support pip 21.0 将取消对此功能的支持。

要解决此问题并继续使用不受支持的 Python 2.7,您不应升级到最新的 pip 版本,而应升级到 < 21 的版本。

pip install --upgrade "pip < 21.0"
Run Code Online (Sandbox Code Playgroud)

  • 如果“pip”已经升级到非工作版本,那么这可能无法正常工作。 (11认同)
  • 我不明白这个问题。我安装了python2.7和python3.5。Python2.7 并没有“死”,但我离题了……如果 PIP 想要 python3.5,那么为什么它要尝试使用 python2.7,或者为什么它甚至关心 python2.7 是否存在于我的系统上?PIP 据说是由版本控制*专家*编写的。 (5认同)

小智 37

由于 PIP 放弃了对 Python 2.7 的支持,因此我们面临着上述问题,以下是在 Ubuntu 上实际对我有用的命令。

sudo apt-get remove --purge python-pip
sudo apt-get autoremove
sudo rm -f /usr/local/bin/pip
sudo easy_install pip==20.3.4
pip --version
Run Code Online (Sandbox Code Playgroud)

输出:pip 20.3.4

CentOS 也可以通过更改包管理器名称来实现。

  • 我只需要执行 `sudo easy_install pip==20.3.4` 但无论如何,这里的建议是唯一对我有用的东西 (14认同)
  • $ sudo easy_install pip==20.3.4 sudo: easy_install: 未找到命令 (3认同)

Sew*_*zyk 8

这对我有帮助(Ubuntu 16.04)

一般来说,我完全删除了 pip 和 pip3,例如:

whereis pip
sudo rm -f <results from whereis pip
whereis pip3
sudo rm -f <results from whereis pip3
Run Code Online (Sandbox Code Playgroud)

搜索 pip 并删除文件和目录。就我而言,是:

sudo rm -fr ~/.local/bin/pip3.5
sudo rm -fr ~/.local/bin/pip3
sudo rm -fr ~/.local/lib/python3.5/site-packages/pip*
sudo rm -rf ~/.cache/pip/
sudo rm -rf  /usr/lib/python2.7/dist-packages/pip*
sudo rm -rf  /usr/lib/python3/dist-packages/pip*
Run Code Online (Sandbox Code Playgroud)

然后我再次安装了pip3:

Python 3.5

wget https://bootstrap.pypa.io/pip/3.5/get-pip.py
Run Code Online (Sandbox Code Playgroud)

Python 3.6

wget https://bootstrap.pypa.io/get-pip.py
Run Code Online (Sandbox Code Playgroud)
python3 get-pip.py --ignore-installed
Run Code Online (Sandbox Code Playgroud)


W. *_*Dan 6

更新:请使用以下命令在python2.7上安装pip

curl  https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
python get-pip.py
Run Code Online (Sandbox Code Playgroud)

好好享受!

  • 感谢您将我推向正确的方向。就我而言,我用 python3 get-pip.py 解决了这个问题 (2认同)