python环境管理的几种方式

  Python语言和Java语言,在开发项目的时候有所不同。Java是系统有一个编译环境,项目所依赖的包,放在各个项目下,这样不同项目如果用到一个包的不同版本,只要和编译器兼容,就没问题。而Python项目依赖的包,会安装在系统Python目录下,如果多个项目使用同一个Python环境,但是依赖同一个包的不同版本,就会引发冲突。因此Python有一个虚拟环境的概念。
  Python虚拟环境的使用,就是为了隔离各个项目的环境,防止不同项目因为使用同一个包的不同版本而引发冲突。目前市面上主要的Python包管理工具有下述5种。下面依次介绍。
 

0.当前的系统情况及Python环境安装

  如下,可以看到,当前用户下比较干净。创建了2个文件夹,分别用来存源码和安装程序。
 
  这里为了下面展示conda怎么用,安装的miniconda。
 

Step1.下载minicnda

Linux:
1 wget -c https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
Windows:
https://docs.conda.io/en/latest/miniconda.html
 

Step2.安装miniconda

# 查看帮助
1 sh Miniconda3-latest-Linux-x86_64.sh -h

# 安装

1 sh Miniconda3-latest-Linux-x86_64.sh -p $HOME/apps/miniconda3_py38

# 创建超链接,方便后面升级

1 cd $HOME/apps
2 ln -s miniconda3_py38 miniconda3

# 修改环境变量

1 cd ~
2 vim .bashrc

进行全局替换::%s/miniconda3_py38/miniconda3/g

 
# 让配置文件生效
1 source .bashrc

Step3.配置pip源和conda源

  由于众所周知的原因,国内访问境外网站的,下载速度特别感人。因此安装Python包的时候,使用国内的镜像会快不少。如果不在全局配置,每次下载需要使用-i参数,特别麻烦。
 

(1) pip源

# 可参考:https://developer.aliyun.com/mirror/pypi?spm=a2c6h.13651102.0.0.3e221b11eFK8RX
 
Linux:
  修改 ~/.pip/pip.conf (没有就创建一个文件夹及文件)。
Windows:
  直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,然后新建文件pip.ini。
 
写入如下内容(以阿里源为例):
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
 
[install]
trusted-host=mirrors.aliyun.com

 (2) conda源

# 可参考:https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/
# 可以执行 conda config --set show_channel_urls yes 生成该文件之后再修改(尤其是Windows 用户可能无法直接创建名为 .condarc 的文件)
 
Linux:
  修改 ~/.condarc (没有就创建一个)
Windows:
  修改user目录下的.condarc
  
写入如下内容:

channels:

  - defaults

show_channel_urls: true

default_channels:

  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main

  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r

  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2

custom_channels:

  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

  msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

  bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

  menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

  simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

 
最后都要执行: conda clean -i  清除索引缓存
 

1.virtualenv

Step1.安装virtualenv

1 pip install virtualenv

 

Setp2.创建虚拟环境

1 virtualenv py38_test_venv --always-copy

 

注意:

  (1)参数可以使用 virtualenv -h 查看

  (2)Virtualenv创建的虚拟环境,就在执行命令时,所在的目录下

Step3.激活虚拟环境

1 source /path/to/py38_test_venv/bin/activate

问题:

  (1)需要知道虚拟环境的位置,才能激活

  (2)由于虚拟环境的位置不确定,不好管理.最好是放到一起

 

Step4.退出虚拟环境

1 deactivate

 

Step5.删除虚拟环境

1 rm -rf /path/to/py38_test_venv

 

2.virtualenv + virtualenvwrapper

Step1.安装Python

准备好Python2和Python3
 

Step2.安装virtualenv + virtualenvwrapper

选一个Python作为主Python,并在该Python环境下,安装下面两个包
1 pip install virtualenv
2 pip install virtualenvwrapper  #(windows下是:pip install virtualenvwrapper-win)

 

Step3.配置环境变量

所有的虚拟环境都会创建到$WORKON_HOME目录下。
linux:(.bashrc)
1 export WORKON_HOME=$HOME/.virtualenvs
2 source /path/to/virtualenvwrapper.sh

windows:

WORKON_HOME=/path/to/pyvirtualenvs/
 

Step4.指定版本建立虚拟环境

1 mkvirtualenv --python=/path/to/python3 py3_test_venvwrapper --always-copy
 
注意:
  (1)可以使用 mkvirtualenv -h 查看帮助
 

Step5.查看系统中的虚拟环境(使用mkvirtualenv 创建)

1 workon

 

Step6.激活虚拟环境

1 workon py3_test_venvwrapper

 

注意:
  (1)这里就不需要知道虚拟环境的位置了。
 

Step7.退出虚拟环境

1 deactivate

 

Step8.删除虚拟环境

1 rmvirtualenv py3_test_venvwrapper

 

3.Conda

  当我们使用的是anaconda或者miniconda科学计算集成环境的时候,默认提供了一个conda的包管理工具,其作用和pip类似,可以使用conda安装环境。
 

Step1.查看系统中的虚拟环境

1 conda env list

 

注意:
  (1)默认是有一个base的虚拟环境,当我们没有创建其他环境的时候,默认指向他。“*”表示的就是当前激活的环境
 

Step2.创建虚拟环境

# 使用本地不存在的版本
1 conda create -n py37_test_conda --copy python=3.7

# 使用本地版本

1 conda create -n py38_test_conda --copy python=3.8 --offline

  注意:

  1. 可以使用 conda create -h 查看帮助
  2. 默认创建在:/path/to/miniconda3/envs
  3. 可以使用-p参数,指定创建路径。一般默认就好
  4. Conda创建的虚拟环境,可以是本地不存在的版本,他会从网上下载一个对应的Python版本(小版本会是最新的)
 

Step3.激活虚拟环境

1 conda activate py37_test_conda

注意:

  (1)这里不需要知道虚拟环境的位置了。

 

Step4.退出虚拟环境

1 conda deactivate

 

Step5.删除虚拟环境

1 conda env remove -n py37_test_conda

 

 4.Pipenv

  pipenv是当前主流的Python环境管理方式之一,很多项目都在使用。还是应该了解使用的。需要注意的是,pipenv的使用需要进到项目目录进行

Step1.安装pipenv

1 pip install pipenv

Step2.搭建虚拟环境

第一步:创建项目文件夹
1 mkdir test_proj

 

第二步:进入文件夹,执行初始化命令
1 pipenv --python 3.8

 

注意:
  (1)可以使用 pipenv -h 获取帮助信息,很全
  (2)需要使用本地Python版本,如果需要联网下载其他版本,需要其他条件
  (3)默认环境构建位置:$HOME/.virtualenvs/test_proj-cH7xaAhp,如需构建在项目目录下,需要配置环境变量:export PIPENV_VENV_IN_PROJECT=1。此时虚拟环境路径为/path/to/project/.venv。看个人习惯和需要。我比较习惯统一管理在一个目录下。
  (4)项目根目录下,添加环境变量文件.env,在进入虚拟环境时会自动添加环境变量。例如:为了避免Python 对stdout缓存导致日志顺序错乱,添加如下环境变量PythonUNBUFFERED="1"
 

Step3.安装依赖包

  使用pipenv创建虚拟环境后,需要用pipenv进行包管理。而不是conda或者pip。使用pipenv安装包的时候,会在项目目录下生成Pipfile文件和Pipfile.lock。
  (1) pipenv install pandas==1.2.0   # 安装pandas并指定版本,如需最新的可不指定版本,会自动lock,lock速度比较慢,可以在安装的时候跳过。
  (2) pipenv install xxxx==xxxx --skip-lock    # 可以在安装的时候跳过lock
  (3) pipenv install --dev pytest --skip-lock   # 只在测试环境安装包
 
注意:

  (1)更改pip 源,修改Pipfile文件中[[source]] 下url : https://mirrors.aliyun.com/pypi/simple

 

Step4.进入虚拟环境,及退出

  此时就和使用workon或者conda activate虚拟环境一致了,可以使用pip管理包了。

  (1)进入虚拟环境: pipenv shell 

  (2)退出虚拟环境:exit

 

Step5.删除虚拟环境

 pipenv --rm 
 

Step6.使用piepenv运行命令

(1)生成requirements.txt(因为有Pipfile,这个不是必须的。但建议还是要生成)

1 pipenv run pip freeze > requirements.txt

 

(2)执行Python 脚本
1 pipenv run python hello.py

 

Step7.其他相关命令

(1)查看包依赖:

1 pipenv graph

 
(2)查看虚拟环境路径:
1 pipenv --venv

 

(3)查看虚拟环境Python解释器的路径
1 pipenv --py

 

(4)更新lock file
1 pipenv lock

 

(5)检查包的安全漏洞
1 pipenv check

 

 (6)使用Pipefile.lock部署环境,
1 pipenv install --system --deploy --ignore-pipfile

注意:

  (1)--system 表示使用系统的Python环境,

  (2)--deploy表示如果lock file is out-of-date,则放弃安装。

  (3)--ignore-pipefile表示不使用Pipfile 而是使用Pipfile.lock安装。

 

5.Pyenv

  Pyenv是系统级的Python 环境管理。就把他当一个命令使用即可。

Step1.安装pyenv

(1)安装依赖
1 yum install readline readline-devel readline-static -y
2 yum install openssl openssl-devel openssl-static -y
3 yum install sqlite-devel -y
4 yum install bzip2-devel bzip2-libs -y
5 yum install gcc-c++ -y

 

(2)从github下载最新的pyenv

1 git clone https://github.com/pyenv/pyenv.git $HOME/apps/pyenv

 

Step2.配置环境变量

(1)配置pyenv的环境变量(Redhat版在.bashrc中添加如下信息)
export PYENV_ROOT=$HOME/apps/pyenv
export PATH="$PYENV_ROOT/bin:$PATH"
 
(2)Add pyenv init to your shell. Please make sure eval "$(pyenv init -)" is placed toward the end of the shell configuration file since it manipulates PATH during the initialization.
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc
(其实就是在.bashrc最后面加一句:eval "$(pyenv init -))
 
注意:
  在启动shell的时候加载pyenv的方式,会有一个问题:就是类似pycharm之类的IDE连不到远程服务器了。因此,生产上可以使用这中方式管理,但是在开发测试阶段可以不用,否则需要注释掉pyenv在.bashrc中的配置,之后再手动执行,比较麻烦。
 

Step3.pyenv管理Python版本

可以先使用pyenv -h查看帮助。

 

# 查看已经安装的版本

1 pyenv versions

注意:

  (1)星号所指,是当前使用的Python

 

# 查看可以安装的Python 版本:

1 pyenv install --list # 或者pyenv install -l

(基本上各个发行版本都有,anaconda等等也都有)

 

# 安装其他版本的Python

1 pyenv install 3.9.1

注意:

  (1)默认使用的是国外的源,下载。可能很慢
  (2)可以使用以下方式安装(用国内源安装很快):
 v=3.9.1;wget https://mirrors.huaweicloud.com/Python/$v/Python-$v.tar.xz -P $HOME/apps/pyenv/cache/;pyenv install $v 
  (3)或者先下载安装包,放在/path/to/pyenv/cache目录下(如果文件夹不存在,创建文件夹),anaconda的sh文件也可以支持,Python安装包需要下载tar.xz或者tar.gz格式的。
  (4)这样安装的Python默认安装到了:/path/to/pyenv/versions
 

# 卸载Python

1 pyenv uninstall 3.9.1

 

# 切换当前Python 环境

shell的优先级高于local和global,优先级顺序spyenv > local > global。
 (1)设置全局的Python版本
设置: pyenv global <版本名称> 
查看: pyenv global 

(2)设置局部的Python版本,

设置: pyenv local <版本名称> 
查看: pyenv local 
 
  此时,版本号写入到当前文件夹下的.Python-version文件。优先级要比global设置的版本优先级高,pyenv会从当前目录开始向上逐层寻找.Python-version文件,直到根目录为止。若找不到,就用global版本。
(3)设置shell的Python版本
 pyenv shell <版本名称> 
 

(4)清除配置

如果感觉Python版本不对,可以使用如下命令先清除pyenv设置
1 pyenv global --unset
2 pyenv local --unset
3 pyenv shell --unset

 

Step4.pyenv安装插件

  pyenv也可以创建虚拟环境,但需要借助一些插件(pyenv-virtualenv)。这些插件其实就是把代码下载到指定的路径下。
 
1.安装pyenv-alias
1 git clone https://github.com/s1341/pyenv-alias.git $(pyenv root)/plugins/pyenv-alias

 

使用方法:
1 VERSION_ALIAS="py27" Python_CONFIGURE_OPTS="--enable-shared" pyenv install 2.7.18

注意:

  (1)需要指定VERSION_ALIAS变量和Python_CONFIGURE_OPTS变量。
  (2)添加Python enable-shared 选项是因为:The --enable-shared option to ensure that shared libraries are built for Python. By not doing this you are preventing any application which wants to use python as an embedded environment from working.
 
2.安装pyenv-migrate
1 git clone git://github.com/yyuu/pyenv-pip-migrate.git $(pyenv root)/plugins/pyenv-pip-migrate

 

使用方法:
1 pyenv migrate <源Python版本名> <目标Python版本名>

 

3.安装pyenv-virtualenv插件
1 git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv

 

注意:
  使用pyenv创建一个虚拟环境,首先会在Python版本名文件夹下的envs文件夹(/path/to/pyenv/versions/<版本号>/envs)中创建一个Python虚拟环境的文件夹,同时会在/path/to/pyenv/versions文件夹下创建一个与虚拟环境名同名的软连接。如果是使用anaconda或者miniconda安装的Python环境,则pyenv virtualenv 会使用conda命令来创建虚拟环境。
 

Step5.创建虚拟环境

(1)创建虚拟环境: pyenv virtualenv <Python版本名> <虚拟环境名称>
1 pyenv virtualenv 3.9.1 py39

 
注意:
  (1)如果不加Python版本名默认使用,当前指定的Python版本构建
 

Step6.激活及退出虚拟环境

  此时可以像直接使用pyenv创建的Python版本一样的方式使用虚拟环境,因为pyenv在/path/to/pyenv/versions里为我们创建了一个软连接指向对应的虚拟环境
pyenv shell <虚拟环境名称>,退出直接,切换Python环境就可以了。
 

Step7.删除虚拟环境(直接用pyenv的命令)

1 pyenv virtualenv-delete <虚拟环境名称>
或者
1 pyenv uninstall <虚拟环境名称>

 

总结

  这些Python环境的管理方式各有优劣,适用的范围也各不相同。可以根据自己的需求和实际情况选择一种。其中pyenv作为系统级的Python环境管理,其实现的是Python多版本共存解决方案Virtualenv是其他虚拟环境管理的基础,使用起来不方便,一般不单独使用。所以常见的虚拟环境管理工具是:virtualenv+virtualenvwrapper、conda、pipenv。其中conda因为和科学计算环境anaconda关联,如果需要使用,可以安装anaconda或者miniconda集成环境virtualenv+virtualenvwrapper和pipenv则各有优劣,但是pipenv建议只用做创建虚拟环境,包管理还是用pip并确保requirements.txt都在。可酌情使用。
另外,conda和pyenv支持使用本地不存在的Python版本(联网下载)。Pipenv如果需要联网使用,需要依赖pyenv。
 
 

posted @ 2021-02-10 11:54  shu2015626  阅读(1141)  评论(0编辑  收藏  举报