如何突破 debian12 对于系统的 pip 安装第三方包的限制?

如何突破 debian12 对于系统的 pip 安装第三方包的限制?

我先使用 apt install python3-pip 安装了一个 pip,然后想使用 pip install idocker 安装 idocker 工具。但是被禁止了

ops@es-mq-20280228:~/opt/rabbitmq$ pip3 install idocker
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.

但是 apt 仓库还没有收录 idocker

ops@es-mq-20280228:~/opt/rabbitmq$ sudo apt install idocker
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package idocker

怎么办?


使用 sudo apt install python3-xxx 的方式不行,因为 xxx 不许被 debian 的 apt 收录才行,我要的 idocker 是我自己写的上传到了 pypi (https://pypi.org/project/idocker/1.4.0/#description),并不是很出名,所以并没有 debian 的 apt 收录

╭─pon@wechat-console ~
╰─➤  sudo apt install python3-idocker                                                                                                                                                                                                                                                                                                                                   1 ↵
[sudo] pon 的密码:
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成
E: 无法定位软件包 python3-idocker

也不想使用虚拟环境,因为这些使用这些命令之前,还需要激活虚拟环境,这太麻烦了


至于 debian 推荐的是用 pipx 来安装,我就不懂了,既然 pipx 可以,为什么还要限制 pip 不行呢?


不过这个 pipx 确实可以

先安装 pipx

sudo apt install pipx

然后再安装需要的第三方包

╰─➤  pipx install idocker
  installed package idocker 1.4.0, installed using Python 3.11.2
  These apps are now globally available
    - idocker
done! ✨ 🌟 ✨
阅读 6.1k
avatarAI BotBETA

这个问题涉及到在 Debian 系统中使用 pip 安装第三方包时遇到的限制。在 Debian 和其他基于 Debian 的系统(如 Ubuntu)中,通常建议使用 apt(Advanced Package Tool)来安装和管理系统级别的软件包,以确保系统和软件包的稳定性。然而,有时候我们可能需要在系统级别之外的 Python 环境中安装第三方包,比如使用 pip。

解决这个问题的一种方法是使用虚拟环境。虚拟环境允许你在一个隔离的环境中安装和使用 Python 包,而不会影响系统级别的 Python 环境。下面是如何使用虚拟环境来安装 idocker 的步骤:

  1. 首先,确保你已经安装了 Python 的完整版(python3-full),因为创建虚拟环境需要它。你可以通过运行以下命令来安装它:
sudo apt install python3-full
  1. 接下来,创建一个新的虚拟环境。你可以使用 Python 自带的 venv 模块来创建虚拟环境。运行以下命令创建一个名为 myenv 的虚拟环境:
python3 -m venv myenv
  1. 激活虚拟环境。在 Linux 和 macOS 上,运行以下命令:
source myenv/bin/activate

在 Windows 上,运行以下命令:

myenv\Scripts\activate
  1. 现在你已经进入了虚拟环境,你可以使用 pip 来安装 idocker。运行以下命令:
pip install idocker

这将安装 idocker 包到虚拟环境中。

  1. 当你完成使用 idocker 后,你可以通过运行以下命令退出虚拟环境:
deactivate

这样,你就可以在 Debian 12 上使用 pip 安装第三方包而不会遇到系统级别的限制了。通过使用虚拟环境,你可以在不影响系统级别 Python 环境的情况下安装和使用第三方包。

2 个回答

看了一下 pipx,使用 pipx 每安装一个包,都会先创建一个独立的虚拟环境,然后把包脚本的 python 解析器指向对应的虚拟环境 python

比如我安装的 idocker

先使用 pipx 安装 idocker

─➤  pipx install idocker
  installed package idocker 1.4.0, installed using Python 3.11.2
  These apps are now globally available
    - idocker
done! ✨ 🌟 ✨

使用 zsh 的 where 命令查看刚刚的 idocker 的启动路径

╭─pon@wechat-console ~
╰─➤  where idocker
/home/pon/.local/bin/idocker

查看 /home/pon/.local/bin/idocker 的内容

╭─pon@wechat-console ~
╰─➤  cat /home/pon/.local/bin/idocker
#!/home/pon/.local/pipx/venvs/idocker/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from idocker.cli.main import cli
if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(cli())

可以看到,这个脚本指向了 /home/pon/.local/pipx/venvs/idocker/bin/python

如果我在安装一个 glances

➤  pipx install glances                                                                                                                                                                                                                                                                                                                                               1 ↵
⚠️  Note: glances was already on your PATH at /usr/bin/glances
  installed package glances 3.4.0.3, installed using Python 3.11.2
  These apps are now globally available
    - glances
done! ✨ 🌟 ✨
╰─➤  where glances
/home/pon/.local/bin/glances
/usr/bin/glances
/bin/glances
─➤  cat /home/pon/.local/bin/glances
#!/home/pon/.local/pipx/venvs/glances/bin/python
# -*- coding: utf-8 -*-
import re
import sys
from glances import main
if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(main())

可以看到,glances 也有了一个新的独立的虚拟环境

看看 pipx list 会显示什么

─➤  pipx list
venvs are in /home/pon/.local/pipx/venvs
apps are exposed on your $PATH at /home/pon/.local/bin
   package glances 3.4.0.3, installed using Python 3.11.2
    - glances
   package idocker 1.4.0, installed using Python 3.11.2
    - idocker

可以看到,pipx list 不是 list 安装的包,而是 list 每次安装的包和对于的虚拟环境


所以,如 debian12 建议的那样,使用 pipx 确实是一个优雅的方案,简单便捷优雅

提示已经给了解决方法了:

  1. apt install python3-xxx
  2. 如果debian的apt仓库里面没有,就用venv或者pipx。

这样操作一下是有原因的,应该是有一部份系统内置的程序用了apt维护的python包。如果这里允许了pip安装其他第三方的依赖,可能会影响到之前apt维护的包。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题