python的virtualenv和venv使用

参考这里

在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.4。所有第三方的包都会被pip安装到Python3的site-packages目录下。

如果我们要同时开发多个应用程序,那这些应用程序都会共用一个Python,就是安装在系统的Python 3。如果应用A需要jinja 2.7,而应用B需要jinja 2.6怎么办?

这种情况下,每个应用可能需要各自拥有一套“独立”的Python运行环境virtualenv就是用来为一个应用创建一套“隔离”的Python运行环境

首先,我们用pip安装virtualenv:

$ pip3 install virtualenv

然后,假定我们要开发一个新的项目,需要一套独立的Python运行环境,可以这么做:

第一步,创建目录:

Mac:~ michael$ mkdir myproject
Mac:~ michael$ cd myproject/
Mac:myproject michael$

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

Mac:myproject michael$ virtualenv --no-site-packages venv
Using base prefix '/usr/local/.../Python.framework/Versions/3.4'
New python executable in venv/bin/python3.4
Also creating executable in venv/bin/python
Installing setuptools, pip, wheel...done.

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

新建的Python环境被放到当前目录下的venv目录。有了venv这个Python环境,可以用source进入该环境:

Mac:myproject michael$ source venv/bin/activate
(venv)Mac:myproject michael$

注意到命令提示符变了,有个(venv)前缀,表示当前环境是一个名为venv的Python环境。

下面正常安装各种第三方包,并运行python命令:

(venv)Mac:myproject michael$ pip install jinja2
...
Successfully installed jinja2-2.7.3 markupsafe-0.23
(venv)Mac:myproject michael$ python myapp.py
...

venv环境下,用pip安装的包都被安装到venv这个环境下,系统Python环境不受任何影响。也就是说,venv环境是专门针对myproject这个应用创建的。

退出当前的venv环境,使用deactivate命令

(venv)Mac:myproject michael$ deactivate 
Mac:myproject michael$ 

此时就回到了正常的环境,现在pippython均是在系统Python环境下执行。

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

virtualenv是如何创建“独立”的Python运行环境的呢?原理很简单,就是把系统Python复制一份到virtualenv的环境,用命令source venv/bin/activate进入一个virtualenv环境时,virtualenv会修改相关环境变量,让命令pythonpip均指向当前的virtualenv环境。

小结

virtualenv为应用提供了隔离的Python运行环境,解决了不同应用间多版本的冲突问题。


还可以参考这里

Mac/Linux

python -m venv env
source env/bin/activate
pip install google-cloud-storage

Windows

py -m venv env
.\env\Scripts\activate
pip install google-cloud-storage
今天分别使用了virtualenv和venv:
使用virtualenv步骤:
1)、sudo pip3 install virtualenv
2)、virtualenv virtualenv_dev
created virtual environment CPython3.8.10.final.0-64 in 317ms
  creator CPython3Posix(dest=/home/test/data/test/virtualenv_dev, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/test/.local/share/virtualenv)
    added seed packages: pip==22.0.4, setuptools==60.9.3, wheel==0.37.1
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator



使用venv步骤:
1)、sudo apt install python3-venv
2)、python3 -m venv venv_dev





Python应用程序通常会使用不在标准库内的软件包和模块,且有时会需要包或者模块的特定版本,如应用程序A需要特定模块的1.0版本但应用程序B需要2.0版本。这意味着只安装其中一个版本可能无法满足每个应用程序的要求,此时我们可以使用虚拟环境来解决这一问题。


在学习虚拟环境的时候遇到了virtualenv、venv、pipenv等名词,这些都与Python的虚拟环境有关,那么这些到底是什么及相互之间又有什么联系呢?


virtualenv:

virtualenv 是目前最流行的 Python 虚拟环境配置工具。它不仅同时支持 Python2 和 Python3,而且可以为每个虚拟环境指定 Python 解释器,并选择不继承基础版本的包。

virtualenv 的优点
使得不同Python应用的开发环境相互独立
开发环境升级不影响其他应用的开发环境,也不会影响全局的环境(默认开发环境是全局开发环境),因为虚拟环境是将全局环境进行私有的复制,当我在虚拟环境进行 pip install 时,只会安装到选择的虚拟环境中。它可以防止系统中出现包管理混乱和版本的冲突

virtualenv 的简单使用
  1. pip 安装 virtualenv
pip3 install virtualenv # 使用自己对应安装的pip版本
  1. 创建虚拟环境目录
mkdir myproject cd myproject
  1. 创建一个独立的Python运行环境: myenv
virtualenv --no-site-packages myenv

注: 1)参数:--no-site-packages (可省略) 其意义在于不复制已经安装到系统Python环境中的所有第三方包从而得到一个“纯净”的运行环境
2) 此时当前目录下会生成一个名为:“myenv” 的目录,该目录中存放刚生成的虚拟环境文件
  1. 激活虚拟运行环境
# Windows: myenv\Scripts\activate.bat # Linux: source myenv/bin/activate

注: 以上命令执行完后会发现命令提示符变了,有个(myenv)前缀,表示当前环境是一个名为“myenv”的Python环境,此时可以在该环境中按照我们熟悉的方式安装库、运行程序等。

  1. 安装各种第三方包,并运行Python命令
pip install jieba python myapp.py

注: 因为此时虚拟环境已经激活,所以可以直接使用命令pippython而不是pip3python3

  1. 使用deactivate命令退出当前的myenv环境
deactivate

其他详细介绍,请参考 virtutalenv 官网:https://virtualenv.pypa.io/en/latest/reference/

venv:

Python 从3.3 版本开始,自带了一个虚拟环境 venv,在 PEP-405 中可以看到它的详细介绍。它的很多操作都和 virtualenv 类似,但是两者运行机制不同。因为是从 3.3 版本开始自带的,这个工具也仅仅支持 python 3.3 和以后版本。所以,要在 python2 上使用虚拟环境,依然要利用 virtualenv
有关venv与virtualenv的区别,virtualenv官网: https://virtualenv.pypa.io/en/latest/reference/#compatibility-with-the-stdlib-venv-module 有详细介绍,博主英文水平不够,请有需要的同学自行解读。

  1. venv 安装
# Windows 中venv已经以标准库的形式存在,不用再单独安装 # Linux sudo apt-get install python3-venv # 如有不同版本的Python3,可指定具体版本venv:python3.5-venv

  1. 在当前目录创建一个独立的Python运行环境: myenv
# Windows py -3 -m venv myenv # Linux python3 -m venv myenv

激活虚拟运行环境、安装第三方包、运行程序及退出虚拟环境等操作均与 virtualenv 相同,在此不再赘述。
其他详细介绍,请参考 venv 官网:https://docs.python.org/zh-cn/3/tutorial/venv.html


pipenv:

pipenv 是 Pipfile 主要倡导者、requests 作者 Kenneth Reitz 写的一个命令行工具,主要包含了Pipfile、pip、click、requests和virtualenv,能够有效管理Python多个环境,各种第三方包及模块。

pipenv 的主要特性:

pipenv集成了pip,virtualenv两者的功能,且完善了两者的一些缺陷。
过去用virtualenv管理requirements.txt文件可能会有问题,Pipenv使用Pipfile和Pipfile.lock,后者存放将包的依赖关系,查看依赖关系是十分方便。
各个地方使用了哈希校验,无论安装还是卸载包都十分安全,且会自动公开安全漏洞。
通过加载.env文件简化开发工作流程。
支持Python2 和 Python3,在各个平台的命令都是一样的。

pipenv 功能强大,是博主强烈推荐的用于创建Python虚拟环境及管理包的方式,特此专门写了一篇 pipenv入门教程,如有需要,请移步。






Pipenv 是 Pipfile 主要倡导者、requests 作者 Kenneth Reitz 写的一个命令行工具,主要包含了Pipfile、pip、click、requests和virtualenv,能够有效管理Python多个环境,各种第三方包及模块。它会自动为您的项目创建和管理一个virtualenv,并在安装/卸载包时从Pipfile中添加/删除包。它还生成非常重要的Pipfile.lock文件,用于生成确定性构建。

Pipenv 特性:

1.pipenv集成了pip,virtualenv两者的功能,且完善了两者的一些缺陷
2.管理requirements.txt文件可能会有问题,而Pipenv使用Pipfile和Pipfile.lock 这使得对于基本用例来说更为优越。
3.各个地方使用了哈希校验,不仅安全,且会自动公开安全漏洞。
4.让您深入了解自己的关系依赖图(例如$ pipenv graph)。
5.通过加载.env文件简化开发工作流程。

Pipenv 所解决的问题:

  1. requirements.txt 依赖管理的局限
使用 requirements.txt 管理依赖的时候可能会出现 不确定构建 (the build isn’t deterministic) 问题,举个栗子:
如果程序中要使用 TensorFlow 库,那么我们应该在requirements.txt里面写上
# requirements.txt: TensorFlow ...

由于没有指定版本,因此通过指令 pip install -r requirements.txt安装依赖模块时,会默认安装最新版本的TensorFlow ,如果新版本向后兼容,这完全不用care,但是如果不能向后兼容就会出现:代码无法在该环境运行,即测试环境和生产环境的同一份requirement.txt,结果出来2份不同的环境。再考虑模块本身的依赖等问题,会发现越来越令人头大。而Pipenv使用的Pipfile和Pipfile.lock文件则可以比较好的解决这些问题。

  1. 多个项目依赖不同第三方库、包版本问题
如应用程序A需要特定模块的1.0版本但应用程序B需要2.0版本,当我在A和B程序间切换时,需要不断检测–卸载–安装模块。这意味着只安装其中一个版本可能无法满足每个应用程序的要求,因此需要创建虚拟环境来将A、B程序所需的第三方包分隔开来,此时常用的 virtualenv、venv均可以满足要求,Pipenv也同样集成了该功能。

Pipenv 简单使用:

  1. Pipenv 安装
# pip 安装 pip3 install pipenv # 全局安装,如果只想在当前用户模式下安装,可添加参数:--user # 如需更新可使用 pip3 install --user --upgrade pipenv

注: 如果在使用当前用户模式下安装pipenv后在shell中提示不可用,则需要把用户库的目录“C:\Users\XXX\AppData\Roaming\Python\Python37\Scripts”添加到你的PATH【系统环境路径】中,然后重启电脑,环境变量生效后即可使用。

  1. Pipenv 常用命令
pipenv --two  # 使用当前系统中的Python2 创建环境
pipenv --three  # 使用当前系统中的Python3 创建环境

pipenv --python 3  # 指定使用Python3创建环境
pipenv --python 3.6  # 指定使用Python3.6创建环境
pipenv --python 2.7.14  # 指定使用Python2.7.14创建环境

注: 1)创建环境时应使用系统中已经安装的、能够在环境变量中搜索到的Python 版本,否则会报错。
2)每次创建环境都会在当前目录下生成一个名为Pipfile文件,用来记录刚创建的环境信息,如果当前目录下之前存在该文件,会将其覆盖。
3)在使用指定版本创建环境的时候,版本号与参数 --python 之间有个空格
使用Python3.6创建环境并查看生成的Pipfile文件内容:


pipenv shell # 激活虚拟环境

环境经激活后,会发现命令提示符变了:(下图中的“pipenv-6sd8rYgi”前缀,表示生成了名为“pipenv-6sd8rYgi”的虚拟环境)


pipenv --where # 显示目录信息 pipenv --venv # 显示虚拟环境信息 pipenv --py # 显示Python解释器信息


pipenv install XXX # 安装XXX模块并加入到Pipfile pipenv install XXX==1.11 # 安装固定版本的XXX模块并加入到Pipfile



pipenv graph # 查看目前安装的库及其依赖

在虚拟环境中安装了jieba和requests两个库:


pipenv check # 检查安全漏洞


pipenv update --outdated # 查看所有需要更新的依赖项 pipenv update # 更新所有包的依赖项 pipenv update <包名> # 更新指定的包的依赖项


检查需要更新的包并更新:(如果所有包依赖都为最新版,再执行更新时,将不会有变化)


pipenv uninstall XXX # 卸载XXX模块并从Pipfile中移除 pipenv uninstall --all # 卸载全部包并从Pipfile中移除 pipenv uninstall --all-dev # 卸载全部开发包并从Pipfile中移除


卸载jieba库,并查看Pipfile文件变化:

exit # 退出当前虚拟环境

退出虚拟环境,命令行提示符前缀消失:



  1. requirements.txt 文件的兼容
  • pipenv可以像virtualenv一样用命令生成requirements.txt 文件
pipenv lock -r > requirements.txt  # 将Pipfile和Pipfile.lock文件里面的包导出为requirements.txt文件
pipenv lock -r --dev > requirements.txt  # 将Pipfile和Pipfile.lock文件里面的开发包导出为requirements.txt文件