如何在 Debian 12(Bookworm)上升级 pip3?

如何在 Debian 12(Bookworm)上升级 pip3?

我刚刚升级到 Debian 12 上的二进制文件pip3仍然不够新,无法支持我需要使用的标志--json--include-injectedansible 模块community.general.pipx

老式的升级方法失败了:

$ sudo pip3 install --upgrade pip
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.

    If you wish to install a non-Debian-packaged Python package,
    create a virtual environment using python3 -m venv path/to/venv.
    Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
    sure you have python3-full installed.

    If you wish to install a non-Debian packaged Python application,
    it may be easiest to use pipx install xyz, which will manage a
    virtual environment for you. Make sure you have pipx installed.

    See /usr/share/doc/python3.11/README.venv for more information.

note: If you believe this is a mistake, please contact your Python installation or OS
distribution provider. You can override this, at the risk of breaking your Python
installation or OS, by passing --break-system-packages.

hint: See PEP 668 for the detailed specification.

pipx这也是我首先需要使用 Ansible 模块的原因。

  • 如何突破“先有鸡还是先有蛋”的难题?
  • --break-system-package在这种特殊情况下使用它是否合理安全?
  • pip或者,在虚拟环境中先使用 CLI 单独安装新版本pipx,然后让 Ansible 模块使用它是否有意义?

答案1

首先,pippipx是独立的程序。pip 是一个通用的 Python 包管理器,它可以在系统范围内工作(我的意思是......它习惯),或者在虚拟环境中。pipx 专注于安装二进制文件(而不是库),它通过创建一个独立的虚拟环境并在其中运行 pip 来工作。

--json--include-injected是 pipx 的标志(特别是“pipx 列表”),而不是 pip 的标志。您的问题是 pipx 太旧,而不是 pip 太旧。

Ansible在这里使用标志

为了安全地升级 pipx,您必须找出最初安装它的方式。它是作为 Debian 软件包安装的(使用 dpkg 和/或 apt),还是使用 pip 手动安装的?找到它的位置,例如:

$ which pipx
/usr/bin/pipx

检查 dpkg 是否识别该文件并知道它属于哪个 Debian 包。

$ dpkg --search /usr/bin/pipx
pipx: /usr/bin/pipx

如果您看到了,那就太好了。只需进行常规系统升级,您就会获得新版本。(这种情况不太可能发生,因为如果这么简单,您甚至不会问这个问题。)

$ dpkg --search /usr/bin/pipx
dpkg-query: no path found matching pattern /usr/bin/pipx

如果您看到该信息,则表示您之前曾使用sudo pip install pipx或类似程序手动安装了它,当时仍允许这样做。在这种情况下,您的目标应该是完全卸载旧的 pipx,以及任何手动安装的依赖项,然后安装官方Debian pipx 包

此命令打印 /usr/lib/python* 中每个文件的 Debian 软件包所有者。不属于任何 Debian 软件包的文件将打印错误。这些错误将告诉您之前手动安装的软件包可能需要手动卸载。

$ find /usr/lib/python* -type f ! -name '*.pyc' -exec dpkg --search {} + 2>&1

我认为卸载它们的正确方法是使用sudo pip uninstall --break-system-packages pipx(其他软件包也是如此)。在这种情况下--break-system-packages应该没问题,因为你只是在清理在标志存在之前造成的混乱。但请确保你只卸载出现“未找到匹配模式的路径”错误的软件包。而不是 dpkg 已经识别的软件包。

当命令不再打印任何“未找到匹配模式的路径”错误时,请使用 安装官方 Debian pipx 包sudo apt-get install pipx。如果它有效,你就大功告成了。如果它打印出与现有文件的任何冲突,旧的 pipx 可能没有完全卸载。

相关内容