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