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

作者站长头像
站长
· 阅读数 21

如何突破 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! ✨ 🌟 ✨
回复
1个回答
avatar
test
2024-06-20

看了一下 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 确实是一个优雅的方案,简单便捷优雅

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容