Jade Dungeon

Python环境隔离

Python 虚拟环境工具:virtualenvwrapper 和 pipenv目前有多种可以用于创建和管理 Python 虚拟环境及版本的相关工具,诸如 venv / pyvenv 、virtualenv、 virtualenvwrapper、pyenv / pyenv-virtualenv、pipenv、Poetry 等, 在这里要跟大家重点介绍的是 virtualenvwrapper 和 pipenv。

virtualenvwrapper

安装

首先需要安装 virtualenvwrapper :

sudo apt-get install python3-distutils
pip3 install --user virtualenvwrapper

查找virtualenvwrapper.sh的位置:

sudo find / -name virtualenvwrapper.sh

通常有两种常见的输出结果,分别为:/usr/local/bin/virtualenvwrapper.sh$HOME/.local/bin/virtualenvwrapper.sh

添加环境变量:

export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source $HOME/.local/bin/virtualenvwrapper.sh

若执行上述命令报错:

virtualenvwrapper.sh: There was a problem running the initialization hooks

则需要修改virtualenvwrapper.shwhich python那一行,将python修改为python3。 或者增加环境变量export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3

以上代码可以添加到~/.bashrc中然后source ~/.bashrc

基本使用

成功后,我们便可以创建虚拟环境,在虚拟环境中我们便可以按需使用 pip 安装并管理软件包, 并不会影响到虚拟环境外的其他 Python 环境:

lsvirtualenv                              # 列出所有虚拟环境
mkvirtualenv -p python3.6 <虚拟环境名称>  # 创建python3.6版本的环境
workon <虚拟环境名称>                     # 进入或切换虚拟环境
deactivate                                # 退出虚拟环境
rmvirtualenv <虚拟环境名称>               # 删除虚拟环境

例:指定 python3.6 创建名为 test 的虚拟环境:

mkvirtualenv -p python3.6 test

若在执行上述命令时报错:

ModuleNotFoundError: No module named 'distutils.spawn'

则需要安装额外的软件包: sudo apt-get install python3-distutils

还有一种创建环境的方法是:

mkdir ~/.venvs

# 让它包含了系统站点包(--system-site-packages),
# 然后让它在`~/.venvs/lpthw`中创建一个虚拟环境
virtualenv −−system−site−packages ~/.venvs/lpthw

# `.`相当于`source`命令激活了lpthw 虚拟环境,也就是bash 的操作符紧跟着
# `~/.venvs/ lpthw/bin/activate`脚本。 
. ~/.venvs/lpthw/bin/activate

命令行提示多了(lpthw) $说明已经在虚拟环境中了。

环境迁移

当我们将某个开发环境内的应用程序部署到线上或迁移到其他虚拟环境内时, 就需要进行环境的迁移,在新的环境下重新安装这个应用程序所有的依赖软件包。

较为常用的一种方法是利用requirements文件,使用:

pip freeze > requirements.txt 

将开发环境下的所有依赖固化至该文件中,在新的环境中利用:

pip install -r requirements.txt 

安装依赖。管理依赖的另外一种方式是结合setuptoolssetup.pyinstall_requires中定义相关依赖库,这和 Python 项目的打包过程有关, 关于这部分我们会在后面的小节中涉及。

pipenv

pipenv 的作者是著名的 Python 开发者 Kenneth Reitz,他同时也是 requests 库的作者。 在众多的虚拟环境管理工具中,pipenv 的亮点在于同时包含 pip 包管理和虚拟环境工具 两者的功能,使用更加的方便。

实现了 pip 包管理操作和软件包依赖记录的自动化处理,便于依赖管理和环境迁移。 使用Pipfile文件取代手动处理requirements.txt的方式,使用Pipfile.lock 文件管理包的依赖关系,这两个文件都无需手动处理,会根据pipenv的相关命令自动进行变更。 在包管理过程中使用哈希校验,保证软件包的完整性。

不过,pipenv目前仍然存在一些问题,建议大家持续关注,但如果要使用在生产环境上, 请谨慎对待。另外,Poetry 同样也是一款值得关注的环境与依赖管理工具, 在环境管理的基础上,还具有构建、打包、发布等功能。

除此之外,在环境隔离方面,大家有兴趣还可以对 Anaconda / conda、docker 等工具进行了解。

python 环境管理工具 Anaconda

  • https://www.jianshu.com/p/62f155eb6ac5
  • https://www.jianshu.com/p/eaee1fadc1e9

实际上不用anaconda比用anaconda要简单不少。 conda唯一比pip好的一点就是,就是有的包在conda里有编译好的。

其实在工程使用中,我们有一套控制python环境的有效实践。 对于开发环境来说其实就是pyenv+venv, 由代码控制所有依赖的版本和生产环境保持一致。

用Python做数据分析的环境初始化 https://note.qidong.name/2018/03/python-data-analyze-init/