4.Python虚拟环境

当我们开发多个应用程序时,可能各应用程序依赖不同版本的工具包。比如应用A需要requests2.21.0 ,而应用程序B需要requests2.23.0。那么每个应用可能需要各自拥有一套“独立”的Python运行环境,下面梳理venv, virtualenv, pipenv 三个工具的使用。

venv

venv为Python内置模块,用于创建和管理虚拟环境的。

  1. 安装
    最新版本的 Python,venv通常会自带安装完成。
    Python3.3增加了venv模块, Python3.5对venv进行了改进,3.5+ 版本官方推荐使用venv作为管理虚拟环境的工具。
    如果系统上有多个版本的 Python,可以通过运行 python3 或您想要的任何版本来选择特定的Python版本。

    python3 -m venv tutorial-env
    将创建 tutorial-env 目录,并在其中创建包含Python解释器,标准库和各种支持文件的副本的目录。
    虚拟环境的常用目录位置是 .venv。 这个名称通常会令该目录在终端中保持隐藏。

  2. 激活虚拟环境
    在Unix或MacOS上,运行:
    source tutorial-env/bin/activate
    激活成功后将更改Shell提示符,以显示正在使用的虚拟环境:
    (tutorial-env)Mac:python_basic Sunny$

    在Windows上,运行:
    tutorial-env\Scripts\activate.bat

  3. 退出虚拟环境

在Unix或MacOS上,运行:
(tutorial-env) SunnyiMac:bin Sunny$ deactivate
在Windows上,运行:
tutorial-env\Scripts\deactivate.bat

virtualenv

  1. 安装virtualenv
    pip3 install -U virtualenv
    以macosx为例
    $sudo pip3 install -U virtualenv
    
    这里使用sudo是为了确保virtualenv命令行命令能安装成功,如果不用sudo可能由于权限问题而导致virtualenv模块安装成功,但无法通过命令行直接使用。

2.创建虚拟环境
第一步,创建目录:

Mac:~ Sunny$ mkdir python_basic
Mac:~ Sunny$ cd python_basic/
Mac:python_basic Sunny$

第二步,创建一个独立的Python运行环境,命名为py_basic

Mac:python_basic Sunny$ virtualenv --no-site-packages py_basic

命令virtualenv就可以创建一个独立的Python运行环境,加上了参数--no-site-packages,这样,已经安装到系统Python环境中的所有第三方包都不会复制过来,这样,就得到了一个不带任何第三方包的“干净”的Python运行环境。

备注: 新版本virtualenv 已没有--no-site-packages 参数,默认创建的就是"干净"Python运行环境

3.激活虚拟环境

Mac:python_basic Sunny$ source py_basic/bin/activate   # sh, bash, ksh, or zsh
(py_basic)Mac:python_basic Sunny$   
注意命令提示符变化,有个(py_basic)前缀,表示当前环境是一个名为py_basic的Python环境
(py_basic)Mac:python_basic Sunny$pip install --upgrade pip # 更新虚拟环境的pip
(py_basic)Mac:python_basic Sunny$pip list  # 查看虚拟环境内已安装的工具包

4.退出虚拟环境

(py_basic)Mac:python_basic Sunnyl$ deactivate 
Mac:python_basic Sunny$ 

通过virtualenv完全可以针对每个应用创建独立的Python运行环境,这样就可以对每个应用的Python环境进行隔离。

virtualenv是实现“独立”的Python运行环境的原理:

  1. 把系统Python复制一份到virtualenv的环境。
  2. 用命令source venv/bin/activate进入一个virtualenv环境时,virtualenv会修改相关环境变量,让命令python和pip均指向当前的virtualenv环境。

pipenv

pipenv 是Python官方推荐的包管理工具
pipenv 目的旨在将包管理领域最有优秀的理念与功能引入到Python世界中来。
pipenv将自动为项目创建和管理虚拟环境,并在安装/卸载模块包时从Pipfile中添加/删除模块包,生成Pipfile.lock来锁定安装包的版本和依赖信息,避免构建错误,确保稳定构建

pipenv主要解决如下几方面问题:

  • 集成pip 和virtualenv 两个工具功能,不再需要单独去使用它们,可以通过pipenv让它们一切协同工作。
  • 针对管理requirements.txt文件可能会出现问题,pipenv使用Pipfile和Pipfile.lock代替requirements.txt
  • 引入哈希机制,哈希无处不在,提升安全;并确保自动公开安全漏洞。
  • 引入模块包依赖关系图,依赖关系一眼可见
  • 通过加载.env文件简化工作流程。

pipenv依赖virtualenv


4.Python虚拟环境_第1张图片
image.png

1. 安装

为了方便使用, 建议全局安装
$ pip install pipenv

2. 使用

通过pipenv创建一个虚拟环境与项目(文件夹)绑定
在项目目录下执行:

  • pipenv install
    创建虚拟环境并与项目目录绑定
SunnyiMac:pip-env Sunny$ pipenv install
Creating a virtualenv for this project…
Pipfile: /Users/Sunny/SunnyLearn/IT/Python/python_venv/pip-env/Pipfile
Using /Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 (3.6.8) to create virtualenv…
⠴ Creating virtual environment...created virtual environment CPython3.6.8.final.0-64 in 1010ms
  creator CPython3Posix(dest=/Users/Sunny/.local/share/virtualenvs/pip-env-LlWfIOtH, clear=False, global=False)
  seeder FromAppData(download=False, pip=latest, setuptools=latest, wheel=latest, via=copy, app_data_dir=/Users/Sunny/Library/Application Support/virtualenv/seed-app-data/v1)
  activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator

✔ Successfully created virtual environment! 
Virtualenv location: /Users/Sunny/.local/share/virtualenvs/pip-env-LlWfIOtH
Creating a Pipfile for this project…
Pipfile.lock not found, creating…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (ca72e7)!
Installing dependencies from Pipfile.lock (ca72e7)…
     ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00
To activate this project's virtualenv, run pipenv shell.
Alternatively, run a command inside the virtualenv with pipenv run.
SunnyiMac:pip-env Sunny$ ls
Pipfile     Pipfile.lock
  • pipenv shell
    激活虚拟环境,若没有找到绑定虚拟环境将自动创建虚拟环境并激活该虚拟环境。
SunnyiMac:pip-env Sunny$ pipenv shell
Launching subshell in virtual environment…
bash-3.2$  . /Users/Sunny/.local/share/virtualenvs/pip-env-LlWfIOtH/bin/activate
(pip-env) bash-3.2$ 

退出pipenv环境
$ exit

说明:
个人理解pipenv在使用过程中,和virtaulenv不同:virtaulenv需要激活进入虚拟环境,pipenv使用过程中比如安装包其实不需要激活虚拟环境,在当前目录操作其实就是在操作本目录下绑定的虚拟环境。

  • pipenv install somepackage
    在虚拟环境下安装包,若没有找到绑定虚拟环境将自动创建虚拟环境。
    $pipenv install flask
    既然已经隔离的为什么不直接用pip 安装 Flask ,而是用pipenv, 个人判断两个都是可以达到目的;原因猜测pipenv本就是希望一个命令通行天下)`
    同时修改Pipfile, Pipfile.lock

  • pipenv uninstall somepackage
    在虚拟环境下卸载包
    $ pipenv uninstall flask
    同时修改Pipfile, Pipfile.lock

  • pipenv graph
    查看安装包的依赖关系
    $ pipenv graph

  • pipenv clean
    清理安装包,删除没有在Pipfile.lock中指定的包
    $ pipenv clean

  • pipenv lock
    生成lockfile
    $ pipenv lock

  • pipenv --rm
    删除一个虚拟环境
    $pipenv --rm

3.扩展

  • 添加shell补齐
    如果使用的是bash, 可添加下面语句到.bashrc.bash_profile

    eval "$(pipenv --completion)"
    

    个人推荐使用下面方式实现命令行补齐支持:
    $ pipenv --completion >> ~/.bash_profile

  • 为了安装指定版本的包信息,可以使用:
    $ pipenv install requests==2.13.0

  • 指定安装包的源
    如果我们需要在安装包时,从一个源下载一个安装包,然后从另一个源下载另一个安装包,我们可以通过下面的方式配置

    [[source]]
    url = "https://pypi.python.org/simple"
    verify_ssl = true
    name = "pypi"
    
    [[source]]
    url = "https://mirrors.aliyun.com/pypi/simple/"
    verify_ssl = false
    name = "aliyun"
    
    [dev-packages]
    
    [packages]
    requests = {version="*", index="aliyun"}
    maya = {version="*", index="pypi"}
    records = "*"
    

设置了两个源:

  • pypi(https://pypi.python.org/simple)
  • aliyun(https://mirrors.aliyun.com/pypi/simple/)

同时指定requests包从aliyun源下载,maya包从pypi源下载

需要特别说明:
国内通过pypi源由于网络问题可能会出现Locking Failed!错误

Installing flask…
Adding flask to Pipfile's [packages]…
✔ Installation Succeeded 
Pipfile.lock (f20c47) out of date, updating to (ef1c0c)…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
✘ Locking Failed! 

切换为国内源,马上解决,推荐使用阿里源
修改目录下的Pipfile文件

# [[source]]
# name = "pypi"
# url = "https://pypi.org/simple"
# verify_ssl = true

[[source]]
name = "aliyun"
url = "https://mirrors.aliyun.com/pypi/simple/"
verify_ssl = true

注意需要注释掉原有source,不然无论将阿里源的配置放在前面还时候后面都会有问题,关于具体原因,通过
pipenv -v install flask可以看出一些端倪,需要进一步深入研究来最终确认问题。//TODO

3. 卸载pipenv

$ pip uninstall pipenv

你可能感兴趣的:(4.Python虚拟环境)