我刚刚升级到 Debian 12 上的二进制文件pip3
仍然不够新,无法支持我需要使用的标志--json
和--include-injected
ansible 模块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
首先,pip
和pipx
是独立的程序。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 可能没有完全卸载。