写在前面

距离上篇博客差了半年,很惭愧,因为促使自己写博客的动力之一就是接触了新东西,想记录下来,这大半年实在不太在状态,写了几篇文章发布后又删除了,好在最近感觉好了不少。

这个学期开始明显感觉校内网限速严重了许多,时不时还断连需要重新认证一下,体验很不好,尤其是用Pipenv安装一些包的时候,尽管知道安装慢很大一部分是网络的问题,但当我看到Pipenv安装报错时,也渐渐对Pipenv起了一些疑虑,有时当我创建一个新的虚拟环境需要很长时间,有时候又Locking很久……,那颗折腾的心又躁动了起来。

为什么需要虚拟环境

防止各种项目冲突顺便方便的导出所有依赖,简单的例子就是A项目中需要的是Django1.0,而B项目中需要的是Django2.0,为了防止来回卸载安装,所以我们使用虚拟环境分别配置单独的运行环境

虚拟环境大杂烩

光是Pycharm所支持的就有 virtualenv Conda Pipenv等等 以及看大佬推荐的Poetry Conda 最后还是选择了顺手的 Hatch

选择哪种虚拟环境工具好

先给出目前的个人结论:用回 virtualenv/venvpip不一定是最方便的,但是至少更可靠 之前我一直都是用的Pipenv,说实在的除了偶尔Creating&Locking慢了点,并没有遇到什么大问题,但当我看到 不要用 Pipenv 改变了 ‘我用着舒服你那问题我没遇见就接着用下去’ 的想法。

其中最让我不能接受的就是打着官方暧昧关系进行宣传以及快一年没有新的 releases

既然已经有了换的心思,满怀希望的去尝试大佬推荐的 Poetry ,嗯官网界面很对我口味,结果正当我安装好初始化时现实又给我来了一巴掌。

→ poetry init

This command will guide you through creating your pyproject.toml config.

[UnicodeDecodeError]
'ascii' codec can't decode byte 0xe8 in position 0: ordinal not in range(128
)

溜了溜了,连最基础的路径下创建文件都能整一个编码错误的项目我是更不敢用了,还是老办法吧。

重回 virtualenv 和 pip 时代

这里我还用到了virtualenvwrapper这个工具来简化virtualenv的操作

pip install virtualenv virtualenvwrapper
# 环境配置
# 查看 virtualenvwrapper.sh 路径
$ which virtualenvwrapper.sh
/usr/local/bin/virtualenvwrapper.sh

# 配置环境变量 (以后创建的环境目录都集中放在 $WORKON_HOME 目录下管理了)
# 配置文件位置: ~/.bashrc (bash) 或 ~/.zshrc (zsh) (Linux/macOS(win自行搜索))
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

# 简化命令 ~/.zshrc (zsh)
# which python  python3 得到-p后的参数值
alias mkv3='mkvirtualenv -p /usr/local/bin/python3'
alias mkv2='mkvirtualenv -p /usr/local/bin/python'
alias lsv='lsvirtualenv'
alias rmv='rmvirtualenv'
alias shv='showvirtualenv'
alias dev='deactivate'

常用命令

# workon  进入切换 环境
$ workon ENVNAME

# mkvirtualenv 创建环境
$ mkvirtualenv ENVNAME

# lsvirtualenv 展示环境列表
$ lsvirtualenv [-b] [-l] [-h]

# rmvirtualenv 删除环境
$ rmvirtualenv ENVNAME

# cpvirtualenv 复制环境
$ cpvirtualenv ENVNAME [TARGETENVNAME]

# allvirtualenv 所有环境运行命令 (比如安装包)
$ allvirtualenv command with arguments
$ allvirtualenv pip install -U pip

# deactivate 退出当前环境
$ deactivate

# mkproject  创建项目
$ mkproject [-f--force] [-t template] [virtualenv_options] ENVNAME

六、发展中的Hatch(不支持Python2)

就在我准备收尾时,突然发现了 Hatch 这个项目,基于virtualenv 简单安装使用下来发现意外的很舒服,具体安装步骤见项目主页,这里简单回顾提及下

# 安装virtualenv和Hatch
pip3 install virtualenv hatch

# 如果重启后hatch用不了那么可能是你没有配置好python的PATH

# 配置环境变量(Linux/macOS(win自行搜索))
# 配置文件位置: ~/.bashrc (bash) 或 ~/.zshrc (zsh)
> which python3
    /usr/local/Cellar/python/3.7.4/bin
> export PATH=/usr/local/Cellar/python/3.7.4/bin:$PATH

常用命令

# 列出所有的虚拟环境(~/.virtualenvs)
hatch env -l
# 创建虚拟环境
hatch env envname
# 进入虚拟环境
hatch bash envname
# 删除虚拟环境
hatch shed -e envname
# 退出虚拟环境
exit
# 列出所有以保存的pypath
hatch pypath -l
# 添加一个指向/usr/bin/python名字为py2的pypath
hatch pypath py2 /usr/bin/python
# 删除一个pypath
hatch shed -p py2
# 使用指定的pypath(这里是py2)作为虚拟环境的解释器
hatch env -py py2 old

# 简化命令 ~/.zshrc (zsh)
alias inv='hatch bash'
alias lsv='hatch env -l'
alias rmv='hatch shed -e'

目前上面这些功能其实和virtualenv差不多,但是项目主页上的TODO中有一行写到python - installs the desired version of Python. will work on each platform,这代表以后版本更新后也可以自由的像Conda那样创建虚拟环境的时候直接指定特定的Python版本。

(值得一提的是:之前我也尝试去用了下Conda来管理,但是他会和pip有一定冲突,而且如果用Conda install会有很多包找不到,在虚拟环境下安装pip又会多出几个额外的依赖,所以放弃了)

期待Hatch后续的更新,毕竟我切换Python版本还是用的少的。