如何突破 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! ✨ 🌟 ✨

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

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