技术背景

在前面几篇博客中我们介绍了容器的使用(博客1博客2博客3博客4博客5),容器是一种系统级的隔离方案,更多的强调资源上的隔离。而这里我们要介绍的python的虚拟环境,更加强调的是依赖的管理。假如一个python项目需要依赖于numpy==1.20.1的版本,另一个python项目必须依赖于numpy==1.20.2的版本。虽然我们也可以直接使用docker或者其他的容器方案来隔离编程环境,但是这会消耗比较大的资源,因为我们并不需要重新构造一整个系统。因此python也提供了一种更加优雅的解决方案:使用virtualenv来构造一个虚拟的python库的环境,这里面我们可以定制化自己所需的python依赖的版本。比较详细的virtualenv使用方法可以参考官方文档,这里我们仅做一些简单的使用方法的介绍和演示。

安装virtualenv

virtualenv可以直接通过pip来安装和管理,这也大大简化了我们的操作:

[dechin@dechin-manjaro virtualenv]$ python3 -m pip install virtualenv
Collecting virtualenv
Downloading virtualenv-20.4.3-py2.py3-none-any.whl (7.2 MB)
|████████████████████████████████| 7.2 MB 7.5 MB/s
Requirement already satisfied: appdirs<2,>=1.4.3 in /home/dechin/anaconda3/lib/python3.8/site-packages (from virtualenv) (1.4.4)
Collecting distlib<1,>=0.3.1
Downloading distlib-0.3.1-py2.py3-none-any.whl (335 kB)
|████████████████████████████████| 335 kB 8.5 MB/s
Requirement already satisfied: filelock<4,>=3.0.0 in /home/dechin/anaconda3/lib/python3.8/site-packages (from virtualenv) (3.0.12)
Requirement already satisfied: six<2,>=1.9.0 in /home/dechin/anaconda3/lib/python3.8/site-packages (from virtualenv) (1.15.0)
Installing collected packages: distlib, virtualenv
Successfully installed distlib-0.3.1 virtualenv-20.4.3

需要注意的是,这里虽然我们可以通过virtualenv来构造一个纯净的python编程环境,但是python的版本是直接依赖于系统里面所包含的python版本的,我们不能通过virtualenv去构造一个不同的python版本。

virtualenv的使用

virtualenv的使用步骤基本上可以简单划分为:创建环境-激活环境-配置和使用环境-关闭环境,以下分别进行演示。

创建一个虚拟环境

首先我们进入到一个空的目录:

[dechin@dechin-manjaro virtualenv]$ ll
总用量 0

然后直接执行virtualenv envname的命令来构建一个虚拟环境,这里因为我们系统中只有一个python版本,多个python版本的环境需要使用-p选项来进行配置。

[dechin@dechin-manjaro virtualenv]$ virtualenv test_env
created virtual environment CPython3.8.5.final.0-64 in 295ms
creator CPython3Posix(dest=/home/dechin/projects/2021-python/virtualenv/test_env, clear=False, no_vcs_ignore=False, global=False)
seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/dechin/.local/share/virtualenv)
added seed packages: pip==21.0.1, setuptools==54.1.2, wheel==0.36.2
activators BashActivator,CShellActivator,FishActivator,PowerShellActivator,PythonActivator,XonshActivator

执行完成上述指令之后,我们发现在刚才的目录下生成了一个与虚拟环境名称一致的目录名:

[dechin@dechin-manjaro virtualenv]$ ll
总用量 4
drwxr-xr-x 4 dechin dechin 4096 4月 1 21:06 test_env

这就代表虚拟环境已经创建成功了。

激活虚拟环境

在使用一个指定的虚拟环境时,我们需要先激活这个虚拟环境,在虚拟环境目录下的bin目录中,有一个名为activate的可执行文件,就是用来激活虚拟环境的:

[dechin@dechin-manjaro virtualenv]$ source test_env/bin/activate
(test_env)[dechin@dechin-20n2s01200 virtualenv]$ python3 -m pip list
Package Version
---------- -------
pip 21.0.1
setuptools 54.1.2
wheel 0.36.2

我们可以发现一个特点,在激活虚拟环境后,在Linux的命令行之前都会带有一个虚拟环境的名称,用于区分当前所在的虚拟环境。而这里虚拟环境中的python第三方库是几乎没有的,是一个非常纯净的环境,需要我们自己去手动安装与配置环境。

安装与配置python库

在虚拟环境中的操作跟在实际环境中的安装操作是一致的,我们一样也可以使用pip来进行安装包的管理,只是这时候安装所执行的变更只会保存到当前的虚拟环境下,不影响实际环境和其他的虚拟环境。

(test_env)[dechin@dechin-manjaro virtualenv]$ python3 -m pip install numpy
Collecting numpy
Downloading numpy-1.20.2-cp38-cp38-manylinux2010_x86_64.whl (15.4 MB)
|████████████████████████████████| 15.4 MB 295 kB/s
Installing collected packages: numpy
Successfully installed numpy-1.20.2
(test_env)[dechin@dechin-manjaro virtualenv]$ python3 -m pip list
Package Version
---------- -------
numpy 1.20.2
pip 21.0.1
setuptools 54.1.2
wheel 0.36.2

安装完成后,我们看到当前安装的numpy版本号是1.20.2。让我们再打开一个新的终端窗口看下实际环境中的numpy的版本号:

[dechin@dechin-manjaro virtualenv]$ python3 -m pip show numpy
Name: numpy
Version: 1.20.1
Summary: NumPy is the fundamental package for array computing with Python.
Home-page: https://www.numpy.org
Author: Travis E. Oliphant et al.
Author-email: None
License: BSD
Location: /home/dechin/anaconda3/lib/python3.8/site-packages
Requires:
Required-by: xarray, vaex-core, tifffile, tables, statsmodels, seaborn, scipy, scikit-learn, scikit-image, PyWavelets, pytools, pythreejs, pyscf, pyarrow, projectq, plotdigitizer, patsy, pandas, opencv-python, numexpr, numba, mkl-random, mkl-fft, matplotlib, ipyvolume, ipydatawidgets, imageio, hiq-projectq, h5py, cupy, bqplot, Bottleneck, bokeh, bkcharts, astropy, ts, hiqfermion

这里可以区分的是,实际环境中命令行的前面不带有虚拟环境的名称。我们可以看到实际环境下的numpy版本是1.20.1,这样一来我们就用这么一个开销并不是很高的方式,实现了两个不同的numpy版本的共存。

退出虚拟环境

在当前的虚拟环境下,可以直接执行deactivate退出。我们可以测试这样的一个场景:先退出虚拟环境,然后再次进入,以确认刚才的操作被自动的保存到了虚拟环境中:

(test_env)[dechin@dechin-manjaro virtualenv]$ deactivate
[dechin@dechin-manjaro virtualenv]$ source test_env/bin/activate
(test_env)[dechin@dechin-manjaro virtualenv]$ python3 -m pip list
Package Version
---------- -------
numpy 1.20.2
pip 21.0.1
setuptools 54.1.2
wheel 0.36.2
(test_env)[dechin@dechin-manjaro virtualenv]$ deactivate

在上述的执行结果中可以看到,对python环境的变更是永久保存下来了的。这一点上来说操作也比docker容器更加容易,在docker中如果需要持久化的保存一个操作,需要在对容器镜像操作之后,执行额外的commit指令才能保存。因此我们认为virtualenv是一个更加优雅、更加轻量级的,python环境差异化管理的解决方案。

总结概要

在前面几篇博客中我们介绍过docker等容器的编程环境解决方案,但是容器作为一个系统级的隔离方案,其实更加强调的是用户间的隔离,这一点也得益其对NameSpace技术的推广和使用。但是在一部分的场景下,比如快速构造一个纯净的python环境、轻量级的操作实现不同python包的共存,容器技术虽然也可以完成,但是功能显得过于冗余,这就需要使用到本文所介绍的virtualenv这样的一个python依赖管理解决方案。文中我们介绍了virtualenv的安装与基本的使用方法,做了一遍比较完整的演示。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/virtualenv.html

作者ID:DechinPhy

更多原著文章请参考:https://www.cnblogs.com/dechinphy/

使用python的虚拟环境virtualenv的更多相关文章

  1. python安装虚拟环境virtualenv

    虚拟环境 虚拟环境是一个将不同项目所需求的依赖分别放在独立的地方的一个工具,它给这些工程创建虚拟的Python环境.它解决了“项目X依赖于版本1.x,而项目Y需要项目4.x”的两难问题,而且使你的全局 ...

  2. Python的虚拟环境virtualenv

    原文地址:blog.sina.com.cn/s/blog_4ddef8f80101eu0w.html Python的虚拟环境可以使一个Python程序拥有独立的库library和解释器interpre ...

  3. 在linux上安装python, jupyter, 虚拟环境(virtualenv)以及 虚拟环境管理之virtualenvwraper

    一, 安装python31.下载python3源码 wget https://www.python.org/ftp/python/3.6.7/Python-3.6.7.tar.xz2.解压缩源码包,去 ...

  4. Python之虚拟环境virtualenv、pipreqs生成项目依赖第三方包

    virtualenv简介 含义: virtual:虚拟,env:environment环境的简写,所以virtualenv就是虚拟环境,顾名思义,就是虚拟出来的一个新环境,比如我们使用的虚拟机.doc ...

  5. python 安装虚拟环境virtualenv

    1.sudo apt install virtualenv 安装失败 2.sudo apt-get update 更新失败 提示: E: 仓库 “http://mirrors.aliyun.com/u ...

  6. windows下python虚拟环境virtualenv安装和使用

    前面介绍了python在ubuntu16.04环境下,python的虚拟环境virtualenv的安装,下面介绍在windows环境下的安装和使用. 环境信息 操作系统:windows10 pytho ...

  7. Python 虚拟环境Virtualenv

    本人也是Python爱好者,众所周知,Python扩展多,每次为了测试,安装各种各样的扩展,这样导致本地的Python环境非常混乱,就有人想到搞个隔离环境  和 本地环境没有关系,随时可以删除这个隔离 ...

  8. Python虚拟环境virtualenv

    用意 virtualenv可以搭建虚拟且独立的python运行环境, 使得单个项目的运行环境与其它项目独立起来. 安装 virtualenv本质上是个python包, 使用pip安装 pip inst ...

  9. 配置python虚拟环境Virtualenv及pyenv

    pyenv pyenv 可以让机器安装各种不同版本的python pyenv install --list 查看可以安装的python版本 pyenv versions 查看已安装的python版本 ...

随机推荐

  1. Swift private(set) All In One

    Swift private(set) All In One SwiftUI Getters and Setters https://docs.swift.org/swift-book/Language ...

  2. Javascript 严格模式("use strict";)详细解解

    1 1 1 Javascript 严格模式("use strict";)详细解解 "use strict";定义JavaScript代码应该在"str ...

  3. 使用 js 实现一个简易版的 vue 框架

    使用 js 实现一个简易版的 vue 框架 具有挑战性的前端面试题 refs https://www.infoq.cn/article/0NUjpxGrqRX6Ss01BLLE xgqfrms 201 ...

  4. jest & code testing

    jest jest & code testing https://jestjs.io/zh-Hans/ 24.9 https://jestjs.io/docs/zh-Hans/getting- ...

  5. 一文搞懂 js 中的各种 for 循环的不同之处

    一文搞懂 js 中的各种 for 循环的不同之处 See the Pen for...in vs for...of by xgqfrms (@xgqfrms) on CodePen. for &quo ...

  6. npm & cli & cp: no such file or directory

    npm & cli & cp: no such file or directory empty files bug https://npm.runkit.com/hui-cli htt ...

  7. NGK Global首尔站:内存是未来获取数字财富的新模式

    近日,NGK路演在NGK韩国社区的积极举办下顺利落下帷幕.此次路演在首尔举行,在活动当天,NGK的核心团队成员.行业专家.投资银行精英.生态产业代表和数百名NGK韩国社区粉丝一起参加NGK Globa ...

  8. .NET 6 Preview 1 发布

    前言 2021 年 2 月 17 日微软发布了 .NET 6 的 Preview 1 版本,那么来看看都有什么新特性和改进吧,由于内容太多了因此只介绍一些较为重点的项目. 统一和扩展 .NET 6 在 ...

  9. 使用 Tye 辅助开发 k8s 应用竟如此简单(三)

    续上篇,这篇我们来进一步探索 Tye 更多的使用方法.本篇我们来了解一下如何在 Tye 中如何对数据库进行链接. Newbe.Claptrap 是一个用于轻松应对并发问题的分布式开发框架.如果您是首次 ...

  10. MacOS下PHP7.1升级到PHP7.4.15

    最近写SDK的时候需要用到object类型提示符,PHPStorm智能提示说需要PHP7.2以上才能支持这种类型提示. 我一查我本机的PHP是7.1.30版本,于是考虑升级一下PHP版本. 首先要尝试 ...