升级后Pip出现问题,无法卸载或升级Pip或Python。

3

我最近尝试运行pip命令,发现我的pip版本相当过时,所以对其进行了升级。这似乎完全破坏了我的pip安装,我无法弄清楚如何重置它。

$ pip3 --version
pip 8.1.1 from /usr/lib/python3/dist-packages (python 3.5)
You are using pip version 8.1.1, however version 22.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

$ pip3 install --upgrade pip
Collecting pip
  Downloading https://files.pythonhosted.org/packages/f3/77/23152f90de45957b59591c34dcb39b78194eb67d088d4f8799e9aa9726c4/pip-22.1-py3-none-any.whl (2.1MB)
    100% |████████████████████████████████| 2.2MB 505kB/s 
Installing collected packages: pip
Successfully installed pip-8.1.1
You are using pip version 8.1.1, however version 22.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

$ pip3 --version
Traceback (most recent call last):
  File "/usr/bin/pip3", line 11, in <module>
    sys.exit(main())
  File "/home/myname/.local/lib/python3.5/site-packages/pip/__init__.py", line 11, in main
    from pip._internal.utils.entrypoints import _wrapper
  File "/home/myname/.local/lib/python3.5/site-packages/pip/_internal/utils/entrypoints.py", line 12
    f"pip{sys.version_info.major}",
                                 ^
SyntaxError: invalid syntax

这似乎源自于这个问题:https://github.com/pypa/pip/issues/9526

我似乎无法卸载pip:

$ python3 -m pip uninstall pip
Traceback (most recent call last):
  File "/usr/lib/python3.5/runpy.py", line 184, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.5/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/myname/.local/lib/python3.5/site-packages/pip/__main__.py", line 29, in <module>
    from pip._internal.cli.main import main as _main
  File "/home/myname/.local/lib/python3.5/site-packages/pip/_internal/cli/main.py", line 57
    sys.stderr.write(f"ERROR: {exc}")
                                   ^
SyntaxError: invalid syntax

我使用的是Python 3.5版本,但似乎无法进行升级:

$ sudo apt-get install python3.6
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package python3.6
E: Couldn't find any package by glob 'python3.6'
E: Couldn't find any package by regex 'python3.6'

我发现了一些StackOverflow答案建议使用替代仓库,但它们也无法工作。
$ sudo add-apt-repository ppa:deadsnakes/ppa
$ sudo apt-get update
$ sudo apt-get install python3.6
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package python3.6
E: Couldn't find any package by glob 'python3.6'
E: Couldn't find any package by regex 'python3.6'

我已尝试了3.6、3.7、3.8、3.9和3.10,但结果相同。

我还发现了一些堆栈溢出的答案,建议编辑/usr/bin/pip3

最初它看起来是这样的:

from pip import main
if __name__ == '__main__':
    sys.exit(main())

我尝试了这个:

from pip._internal import __main__
if __name__ == '__main__':
    sys.exit(main())

还有这个: 我尝试了这个:

from pip._internal import __main__
if __name__ == '__main__':
     sys.exit(__main__._main())

但是两者都没有解决这个问题。

为了确保我没有混淆本地版本,我尝试了上述所有方法,使用/usr/bin/pip3 --version而不仅仅是pip3 --version,结果相同。

现在我有点不知道如何获得一个可用的Python和Pip版本。


来自问题的建议:

$ sudo python3.5 -m easy_install pip
Searching for pip
Best match: pip 22.1
Adding pip 22.1 to easy-install.pth file
Installing pip3 script to /usr/local/bin
Installing pip3.10 script to /usr/local/bin
Installing pip script to /usr/local/bin

Using /home/myname/.local/lib/python3.5/site-packages
Processing dependencies for pip
Finished processing dependencies for pip

$ ls -lh /usr/local/bin/*pip*
-rwxr-xr-x 1 root root 361 May 12 19:49 /usr/local/bin/pip
-rwxr-xr-x 1 root root 363 May 12 19:49 /usr/local/bin/pip3
-rwxr-xr-x 1 root root 369 May 12 19:49 /usr/local/bin/pip3.10

这三个语句返回相同的内容:

$ /usr/local/bin/pip --version
$ /usr/local/bin/pip3 --version
$ /usr/local/bin/pip3.10 --version
Traceback (most recent call last):
  File "/usr/local/bin/pip", line 11, in <module>
    load_entry_point('pip==22.1', 'console_scripts', 'pip')()
  File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 561, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2631, in load_entry_point
    return ep.load()
  File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2291, in load
    return self.resolve()
  File "/usr/lib/python3/dist-packages/pkg_resources/__init__.py", line 2297, in resolve
    module = __import__(self.module_name, fromlist=['__name__'], level=0)
  File "/home/myname/.local/lib/python3.5/site-packages/pip/_internal/cli/main.py", line 57
    sys.stderr.write(f"ERROR: {exc}")
                                   ^

我现在使用这里的"第二种方法"(手动安装)已经安装了Python3.6:https://askubuntu.com/questions/1152640/apt-install-doesnt-install-python3-6

然后我使用以下命令升级了pip:

sudo python3.6 -m pip install pip --upgrade

现在运行 pip --versionpip3 --version 会出现错误,但是直接访问可执行文件可以正常工作:
$ /usr/local/bin/pip --version
pip 21.3.1 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)

别名目前指向:

$ which pip
/home/sortitoutsi/.local/bin/pip
$ which pip3
/home/sortitoutsi/.local/bin/pip3

看起来其他东西现在也出问题了,比如 aws

$ aws --help
Traceback (most recent call last):
  File "/usr/local/bin/aws", line 19, in <module>
    import awscli.clidriver
  File "/usr/local/lib/python2.7/dist-packages/awscli/clidriver.py", line 17, in <module>
    import botocore.session
  File "/usr/local/lib/python2.7/dist-packages/botocore/session.py", line 29, in <module>
    import botocore.configloader
  File "/usr/local/lib/python2.7/dist-packages/botocore/configloader.py", line 19, in <module>
    from botocore.compat import six
  File "/usr/local/lib/python2.7/dist-packages/botocore/compat.py", line 26, in <module>
    from dateutil.tz import tzlocal
  File "/usr/local/lib/python2.7/dist-packages/dateutil/tz/__init__.py", line 1, in <module>
    from .tz import *
  File "/usr/local/lib/python2.7/dist-packages/dateutil/tz/tz.py", line 16, in <module>
    from six import string_types, PY3
ImportError: No module named six

仅通过重新安装 AWS CLI sudo python -m pip install awscli 似乎已经解决了上述问题。我猜测在某个时候通过sudo apt-get update强制更新了 AWS CLI,因为发现了一个更新的 Python 安装包。


修复 pip:https://dev59.com/AFEG5IYBdhLWcg3wct9F#65871131 - phd
您似乎使用的是旧操作系统,无法安装更高版本的Python(和Pip)包。Python 3.5已经不再受支持;即使是3.6也已经过了生命周期。如果您无法升级操作系统,请考虑安装更新的Python。最好作为用户安装(也就是说,不要使用sudo,因为这可能会破坏您的系统)。我推荐使用pyenv来完成这个任务,但需要进行一些设置(安装必要的构建包)。如果您使用pyenv,请仔细阅读适用于您情况的安装说明。但首先请考虑使用更高版本的操作系统。 - 9769953
顺便提一下,你得到的无效语法错误是关于使用f-strings的,这是在Python 3.6中引入的。所以3.5出现错误也就不足为奇了。 - 9769953
我使用的是Ubuntu 16,也许升级到Ubuntu 18会有所帮助。 - John Mellor
现在已经发布了22.04 LTS版本。这将至少持续到2027年(https://ubuntu.com/about/release-cycle)。 - 9769953
1个回答

2
不要尝试安装您的操作系统不支持的Python版本和包(来自另一个ppa)。这可能会导致系统崩溃。
您尝试安装的Pip软件包,幸运的是,位于本地目录:$HOME/.local/。请检查$HOME/.local/bin/$HOME/.local/lib/python3.5/site-packages/中是否有其他安装内容。如果没有(或者没有重要的内容),请将该目录重命名:
mv ~/.local ~/.local_aside

现在,您应该重新拥有Pip系统了。
您可能会失去一些早期安装的其他软件包(现在可能在~/.local_aside中),但是可以尝试重新安装这些软件包。可以使用系统软件包(例如python3-numpy)或再次使用pip3 install numpy之类的命令进行安装。虽然pip可能会遇到找不到正确的NumPy版本的问题,因为Python 3.5已不再受支持(系统软件包应该没问题)。
如果你想使用更新的Python版本,可以安装本地(仅限用户)版本。我推荐使用pyenv进行安装,这需要一些设置(安装必要的构建软件包)。如果你使用pyenv,请仔细阅读你的情况下的安装说明。一旦安装成功,你可以快速安装任何版本的Python,并且在小版本之间,它们甚至不会相互干扰(也就是说,python3.9 -m pip install numpy将是一个单独的安装,与python3.10 -m pip install numpy没有关系,如果需要,两者都可以愉快地共存)。
但是,不要使用sudo以root身份安装:你的系统会变得混乱并可能出现故障。
另一个选择是 Conda,以 miniconda3 的形式(我更喜欢这种形式)。Conda 可以并且也会安装 C 库依赖项,并积极尝试解决 Python 包之间的版本冲突(如果您需要安装大量包的情况下)。再次浏览手册以开始使用,但它相对来说很容易使用,并不会妨碍您的操作系统。

实际上,好像有一些文件已经安装在/usr/local/bin中了。我现在正在尝试删除它们。 - John Mellor
不要删除,先移动/重命名。这样更容易将它们放回原处。/usr/local/bin 通常是安全的,可以让它们保留。而 ~/.local/bin 可能更容易干扰命令。 - 9769953

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接