pipx 主要目的是把命令行程序装到里边隔离起来,然后默认 link 到 ~/.local/bin. 比如一些常见的命令行工具:youtube-dl, you-get, etc. pipx 其实就是对于 venv 的封装(因为它文档里写着不支持 3.5 以及以前版本)。每一个命令(包、库)一个虚拟环境,方便升级、卸载。没人用这玩意儿做开发环境管理,因为它根本就不是被定位成干这个的。
venv, virtualenv 属于基本没人用的环境管理,我只是在部署时用用 venv,因为它是内置库。venv, virtualenv 缺点:只支持虚拟环境管理,不能安装管理不同版本 Python ;创建出来的虚拟环境位置分散在各个项目中,不能统一管理(主要是删除)。
virtualenv (第三方库) 比 venv (标准库)出生早,功能基本被后者代替。唯一使用 virtualenv 而不是 venv 的理由是 venv 在 3.6 后才可用。
在 virtualenv 之后发展出了 virtualenvwrapper,唯一改进就是把所有虚拟环境统一创建在一个目录下。这样方便删除不用的环境。如果放在各个项目里时间一长容易忘记。
pyenv, conda 既能够管理虚拟环境,也能管理 Python (下载、安装不同版本 Python,virtualenv 只能指定使用哪个现存 Python 创建虚拟环境)。虚拟环境放在一个统一的位置。
conda 与 pyenv 不同的是,conda 还是包管理工具(对比 pip )。conda 自己提供了编译好的包和 Python,主要解决的是非*nix 平台的依赖编译问题。个人认为不是 Windows 平台、不搞科学计算,不需要这个工具。(另外千万不要同时使用 conda install, pip install 安装包,这是 2 套不同的机制)
pyenv 只能在*nix 使用,属于 rbenv, pyenv, nodenv 家族产品(插一句,SB NVM 滚出),其安装 Python 基于源码编译安装。我最喜欢的是这个工具的虚拟环境切换方式,基于 shim 。与前边所有工具不同点在于,不需要每次使用前手动切换环境,如 conda activate myenv 。通过 shim 机制,pyenv/rbenv/nodenv 将 python 可执行程序版本的判断延迟到了运行前(它的决定机制参见其文档,这里不细说了)。实际由 ~/.pyenv/shims/python 决定该使用哪个环境的 python,从而实现进入目录自动切换 python/虚拟环境。
另外,这么大人了,也该学会搜索了。
参考
What is the difference between venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv, etc?
https://stackoverflow.com/a/41573588/5101148