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


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 = "*"
    

设置了两个源:

同时指定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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容