参考:http://www.cnblogs.com/wilber2013/p/4774022.html
virtualenv documentation: https://virtualenv.pypa.io/en/latest/
virtualenvwrapper documentation: http://virtualenvwrapper.readthedocs.org/en/latest/
http://docs.python-guide.org/en/latest/dev/virtualenvs/
http://pythonguidecn.readthedocs.io/zh/latest/dev/virtualenvs.html
virtualenv 中文文档地址 : http://virtualenv-chinese-docs.readthedocs.io/en/latest/#
由于 Python 的版本众多,还有 Python2 和 Python3 的争论,因此有些软件包或第三方库就容易出现版本不兼容的问题。同时在python 开发中,我们可能会遇到一种情况,就是当前的项目依赖的是某一个版本,但是另一个项目依赖的是另一个版本,这样就会造成依赖冲突。
对于上面的问题,已经有很多现成的个工具可以解决。根据解决上面问题的方法,这些工具大概可以分为两类:
- Python版本 切换工具 【 真实的Python环境,但是却是不同的版本 】
- 特定Python版本 的 虚拟环境 切换工具。【针对某一个版本的Python,来创建新的Python环境】
批量 安装 Python 包
冻结(freeze) 环境:就是将当前环境的软件包等保存下来:
$ pip freeze > requirements.txt$
$ cat requirements.txt
重建(rebuild) 环境:就是在部署的时候,在生产环境安装好对应版本的软件包,不要出现版本兼容 等问题.
$ pip install -r requirements.txt 配合pip,可以批量安装对应版本的软件包,快速重建环境,完成部署
对于每个虚拟环境,都可以通过下面的命令很方便的进行环境部署:
- pip freeze > requirements.txt 将包依赖信息保存在requirements.txt文件
- pip install -r requirements.txt 会自动从网上下载并安装所有包
1、Python版本 环境 切换工具
Python 版本环境切换工具的作用就是让多个不同版本的 Python 可以在系统上共存。并且提供简单的命令来支持不同 Python 版本之间的切换。
工具 | 介绍 |
pyenv | 目前最流行的 python版本环境切换工具,但是不支持 Windows |
pywin | Windows 上 pyenv 的替代品,但是功能相对 pyenv 比较少 |
py.exe | Python 3.3 版本以后 Windows 系统自带的启动工具(Python Launcher for Windows),可以直接在命令行中使用 |
1.1 pyenv:Linux 上的 Python 多版本管理
From: https://my.oschina.net/lionets/blog/267469
pyenv 命令参考:https://github.com/pyenv/pyenv/blob/master/COMMANDS.md#command-reference
提到 Python 环境管理,更多人可能会首先想到 virtualenv。但与用于创建独立包环境的 virtualenv 不同,pyenv 的作用仅限于维护不同版本的 Python。它的使用不依赖于 Python,是一个简单、独立的纯 shell 脚本工具。pyenv 也可以以 pyenv-virtualenv 插件的形式支持 virtualenv,强烈建议使用。安装后比较方便的是可以在你 cd 到项目目录时自动切换相应的虚拟环境,而不用老是 source
.
pyenv 在安装和配置完毕后可以实现:一键(命令)切换 全局、本地 或 当前 shell 使用的 Python 版本
pyenv 的美好之处在于,他并没有使用将不同的 $PATH
植入不同的 shell 这种高耦合的工作方式,而是简单地在 $PATH
的最前面插入了一个垫片路径(shims):~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin
。所有对 Python 可执行文件的查找都会首先被这个 shims 路径截获,从而架空了后面的系统路径。
和 git 一样,pyenv 命令根据第一个参数委托给子命令。最常见的子命令有:
- pyenv commands
- pyenv local
- pyenv global
- pyenv shell
- pyenv install
- pyenv uninstall
- pyenv rehash
- pyenv version
- pyenv versions
- pyenv which
- pyenv whence
pyenv 基本使用
1. 安装:git clone https://github.com/pyenv/pyenv.git
2. 配置 pyenv 环境变量
echo 'export PYENV_ROOT="$HOME/pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
3. 基本命令
pyenv commands 查看 pyenv 命令
pyenv install --list 查看可安装的 python 版本
pyenv versions 查看已安装版本
pyenv version 查看当前使用的 python 版本
pyenv install -v 版本号 安装 python
pyenv rehash 刷新 python 已安装列表
pyenv uninstall 版本号 删除 python
pyenv global 版本号 设置当前全局python版本
pyenv local 版本号 设置局部python版本
pyenv local --unset 取消局部python版本设置,或者删除当前目录下的.python-version文件
4. 安装 pyenv-virtualenv 插件
git clone git://github.com/yyuu/pyenv-virtualenv.git ./pyenv/plugins/pyenv-virtualenvecho 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
source ~/.bash_profile
5. 使用 pyenv-virtualenv
pyenv virtualenv 版本号 name 创建一个虚拟环境,命名为name 创建好后可通过pyenv versions来查看
pyenv activate name 切换到 name 虚拟环境中
pyenv deactivate 推出虚拟环境
pyenv virtualenv-delete name 删除 name 环境
简单使用
pyenv version # 查看当前版本
pyenv versions # 查看所有版本
pyenv install --list # 查看所有可安装的版本
pyenv install 3.6.5 # 安装指定版本
pyenv rehash # 安装新版本后rehash一下
pyenv uninstall 3.5.2 # 删除指定版本
pyenv global 3.6.5 # 指定全局版本
pyenv global 3.6.5 2.7.14 # 指定多个全局版本, 3版本优先
# 实际上当你切换版本后, 相应的pip和包仓库都是会自动切换过去的
效果:
包管理插件 pyenv-virtualenv
首先下载:$ git clone https://github.com/pyenv/pyenv-virtualenv.git $.pyenv/plugins/pyenv-virtualenv
克隆完成后添加如下到 shell 配置文件(mac的话是.zshrc):
$ echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
实际上 mac 用户直接 brew 安装就可以了...
$ brew install pyenv-virtualenv
$ eval "$(pyenv init -)"
$ eval "$(pyenv virtualenv-init -)"
使用:
# 创建一个3.6.5版本的虚拟环境, 命名为v365env, 然后激活虚拟环境
$ pyenv virtualenv 3.6.5 v365env
$ pyenv activate v365env
# 关闭虚拟环境
$ pyenv deactivate v365env
当切换 python 解释器的时候对应的 pip 和包库也会一并切换过去,而且可以为指定版本的解释器创建项目所需的虚拟环境,切换的时候也异常简单。
常用的做法是为每个项目创建不同的虚拟环境,当进入该环境的时候就可以随便浪而不用担心影响到其它项目,搭配Pycharm使用效果更佳。
1.2 pywin:Windows 上 Python 版本环境切换工具
现在看看 Windows上Python版本环境切换工具 pywin。
对于pywin的工作原理就可以简单的理解为,通过pywin提供的命令可以简单的以设置环境变量的方式决定优先使用特定版本的Python。
安装
对于pywin,我们可以使用源码、easy_install和pip三种方式进行安装,关于这些安装方式的关系,请参考前一篇文章。
下面通过pip来安装pywin:
常用命令
安装完成之后就看看pywin的常用命令。
"pyassoc"和"pywin genlaunchers"是两个配置相关的命令。我本机安装了2.7和3.4两个版本的Python,默认环境变量指向2.7,配置完成后就会就会在2.7目录中生成本机安装所
有Python版本的launcher。
配置完成之后,就可以通过pywin进行不同版本之间的Python切换了。
1. 打开环境变量 PAHT 中第一个 Python 版本环境
C:\Users\tianw1>pywin
Python 2.7.7 (default, Jun 1 2014, 14:17:13) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
2. 打开 Python 3.4
C:\Users\tianw1>pywin -3.4
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
3. 将 Python 3.4 设置为默认的 Python 执行环境,根据输出也可以看出,其实就是将 Python 3.4 目录放在环境变量 PATH 的前面位置
C:\Users\tianw1>pywin setdefault 3.4Setting default python for active session to: 3.4C:\Python34;C:\Python34\Scripts -- now at front of PATH
# 由于Python 3.4中没有安装pywin,所以会报错
C:\Users\tianw1>pywin
'pywin' is not recognized as an internal or external command,
operable program or batch file.C:\Users\tianw1>python
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
4. 即使上面通过 pywin 将默认 Python 版本环境设为 3.4,但是由于文件的查找还是先本地,然后环境变量 PATH。所以,下面方式使用的还是 2.7 版本,同时也可以再通过 pywin 将 2.7 设置为默认 Python 版本环境。
C:\>cd Python27
C:\Python27>python
Python 2.7.7 (default, Jun 1 2014, 14:17:13) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()C:\Python27>pywin setdefault 2.7Setting default python for active session to: 2.7C:\Python27;C:\Python27\Scripts -- now at front of PATHC:\Python27>
2、特定Python版本 虚拟环境 切换工具
简单的说,虚拟环境切换工具就是可以根据当前使用的Python版本环境来创建多个虚拟的Python环境。这些虚拟的环境之间相互独立,可以安装各个环境所需的 Python 包。
工具 | 介绍 |
virtualenv | 目前最流行的 python虚拟环境 配置工具 |
virtualenvwrapper | 使用shell开发,是对 virtualenv 的一个封装,简化了virtualenv 命令的使用,并且进行了一些功能扩展 |
virtualenvwrapper-win | 使用 Windows batch shell 开发的 virtualenvwrapper |
venv | Python 3.3 版本以后自带的虚拟环境工具,仅支持 python 3.3 和以后版本 |
2.1 virtualenv
virtualenv 通过创建一个虚拟化的 python 运行环境,将我们所需的依赖安装进去的,不同项目之间相互不干扰。然后在每个环境中安装需要的软件包(配合 pip 使用),这一系列的环境是相互隔离的。作为一个独立的环境就不容易出现版本问题,还方便部署。
- Github: GitHub - pypa/virtualenv: Virtual Python Environment builder
- Doc: https://virtualenv.pypa.io/en/latest/
virtualenv 安装
VirtualEnv 用于在一台机器上创建多个独立的 Python 运行环境。
Virtualenv 可用于创建独立的 Python 环境,是一个非常好的 virtual Python environment builder,他最大的好处是,可以让每一个 python 项目单独使用一个环境,而不会影响 python 系统环境,也不会影响其他项目的环境。在这些环境里面可以选择不同的 Python 版本或者不同的 Packages,并且可以在没有 root 权限的情况下在环境里安装新套件,互相不会产生任何的影响。
为什么要用 virtualenv ?
- 隔离项目之间的第三方包依赖,如A项目依赖 django1.2.5,B项目依赖 django1.3。
- 为部署应用提供方便,把开发环境的虚拟环境打包到生产环境即可,不需要在服务器上再折腾一翻。在服务器上都不用安装virtualenv,直接将virtualenv创建的目录拷贝到服务器,修改路径,进行虚拟环境迁移就可以用了。
- 还可以用在没有 root 权限的 python 环境配置上,如果没有 root 权限,可以先自己搞一个 virtualenv,再在 virtualenv 中使用 pip 安装。(系统中没有pip,并且也没有root权限使用sudo apt-get安装)
虚拟环境中安装的库的位置在哪 ?
在虚拟环境中安装的库在 env/Lib/site-packages/ 目录里,而不是在系统的 python 的 Lib/site-packages 目录里,这就是为什么虚拟环境是分开的。
注意:virtualenv 创建的虚拟环境与主机的 Python 环境完全无关,你主机配置的库不能在 virtualenv 中直接使用。你需要在虚拟环境中利用 pip install 再次安装配置后才能使用。
安装 virtualenv 比较简单,无论是在linux系统上还是windows上都可以通过pip来进行安装,如下:pip install virtualenv
如果安装不成功也可以下载 virtualenv源码 package,通过执行 setup.py 来安装 virtualenv。同时因为 python2 和 python3 的不同,因此也有了两种 pip 和 pip3 两种 python 包安装工具,而两种工具安装的
virtualenv 也是不相同的,py2 安装的 virtualenv 虚拟化出来的python运行环境是python2的,py3安装的virtualenv默认虚拟化环境则是python3的。
网速较好可以通过 pip 来安装, 系统没有 pip 的请参考 pip2 或 pip3
pip install virtualenv
pip install setuptools # 如果提示安装就执行这个
virtualenv 创建
mkdir myproject 创建项目文件夹 myproject
cd myproject 进入项目目录
virtualenv myproject_ENV 创建虚拟环境 myproject_ENV
这时候会发现在 myproject 目录下新增了一个 myproject_ENV 的文件夹。
virtualenv 使用
cd myproject_ENV 进入虚拟环境目录 myproject_ENV
source ./bin/activate 激活
这时候在命令行的最左边会显示该虚拟环境的名称。不妨使用下面的命令查看一下变化:
which python
which pip
pip list
如果想要退出虚拟环境,使用这个命令就可以了:deactivate
virtualenv 的基本使用
$ virtualenv venv 创建虚拟环境
$ virtualenv -p /usr/bin/python2.7 venv 为环境指定Python解释器:
$ source venv/bin/activate 激活虚拟环境
$ deactivate 停止虚拟环境。退出虚拟环境
删除虚拟环境 直接删除目录即可
激活虚拟环境之后就可以通过命令 pip install 来安装 python 包了,这里安装 python 包就不需要 root 权限了,直接就可以安装十分方便。
在 venv 的环境中,使用 pip 安装的包都不会再是全局性的包,只会在当前的虚拟环境中起作用,避免了污染系统环境。
运行 pip 带 –no-site-packages 选项的 virtualenv 将不会包括全局安装的包。这可用于保持包列表干净, 以防以后需要访问它。(这在 virtualenv 1.7及之后是默认行为)
virtualenv 各种其他命令如下:
$ virtualenv [OPTIONS] DEST_DIR选项:
--version 显示当前版本号。
-h, --help 显示帮助信息。
-v, --verbose 显示详细信息。
-q, --quiet
不显示详细信息。
-p PYTHON_EXE, --python=PYTHON_EXE 指定所用的python解析器的版本,比如 --python=python2.5 就使用2.5版本的解析器创建新的隔离环境。 默认使用的是当前系统安装(/usr/bin/python)的python解析器
--clear 清空非root用户的安装,并重头开始创建隔离环境。
--no-site-packages 令隔离环境不能访问系统全局的site-packages目录。
--system-site-packages 令隔离环境可以访问系统全局的site-packages目录。
--unzip-setuptools 安装时解压Setuptools或Distribute
--relocatable 重定位某个已存在的隔离环境。使用该选项将修正脚本并令所有.pth文件使用相当路径。
--distribute 使用Distribute代替Setuptools,也可设置环境变量VIRTUALENV_DISTRIBUTE达到同样效要。
--extra-search-dir=SEARCH_DIRS 用于查找setuptools/distribute/pip发布包的目录。可以添加任意数量的–extra-search-dir路径。
--never-download 禁止从网上下载任何数据。此时,如果在本地搜索发布包失败,virtualenv就会报错。
--prompt==PROMPT 定义隔离环境的命令行前缀。
使用
[root@localhost home]# virtualenv MTP # 创建名为MTP的虚拟环境
New python executable in /home/MTP/bin/python
Installing setuptools, pip, wheel...done.
[root@localhost home]# ls # 会在当前目录生成一个目录
MTP
[root@localhost home]# cd MTP/
[root@localhost MTP]# ls
bin include lib lib64 pip-selfcheck.json
[root@localhost MTP]# source ./bin/activate # 启动虚拟环境后, 此时命令行会多一个(MTP)
(MTP) [root@localhost MTP]# pip freeze # MTP为虚拟环境名称, 接下来所有模块都只会安装到该目录
(MTP) [root@localhost MTP]# pip list
pip (9.0.0)
setuptools (28.7.1)
wheel (0.30.0a0)
(MTP) [root@localhost MTP]# deactivate # 退出虚拟环境, 将回到系统默认的Python解释器环境
[root@localhost MTP]#
删除
删除一个虚拟环境, 只需要删除它的目录. 有必要请执行( rm -rf venv )
2.2 扩展包 Virtualenvwrapper
VirtualEnvWrapper 为 VirtualEnv 提供了一些便利的命令行上的封装。
为了使用 virtualenv 更方便,可以借助 virtualenvwrapper。Virtualenvwrapper 的作用是:更方便的创建/激活/管理/销毁虚拟环境。
Virtaulenvwrapper 是 virtualenv 的扩展包,它提供了一系列命令用于更方便管理虚拟环境,它可以做:
- 1. 将所有虚拟环境整合在一个目录下
- 2. 管理(新增,删除,复制)虚拟环境
- 3. 切换虚拟环境 …
virtualenvwrapper 提供环境名字的 tab 补全功能.
$ sudo pip install virtualenvwrapper 安装 virtualenvwrapper
$ source /usr/local/bin/virtualenvwrapper.sh 加载 virtualenvwrapper 创建虚拟环境
默认创建的虚拟环境位于 ~/.virtualenvs ,可以通过环境变量 $WORKON_HOME 来定制。 $ mkvirtualenv test2-env 创建 test2-env 虚拟环境后,会自动激活环境,注意看Shell提示符的改变:
(test2-env)CL-USER> test2-env$ $ mkvirtual [环境名称] 创建 虚拟环境
$ lsvirtualenv 列出所有虚拟环境
$ workon test2-env 激活 test2-env 虚拟环境
$ cdvirtualenv 进入到当前激活的虚拟环境的目录中
$ cdsitepackages 进入到当前激活的虚拟环境的 site-packages 目录
$ lssitepackages 列出 site-packages 目录的所有软件包
$ deactivate 停止虚拟环境。离开虚拟环境
$ rmvirtualenv test2-env 删除虚拟环境
安装
[root@localhost MTP]# pip install virtualenvwrapper
[root@localhost MTP]# echo "export WORKON_HOME=$HOME/.virtualenvs" >> ~/.bashrc
[root@localhost MTP]# source ~/.bashrc
[root@localhost MTP]# source $(find /usr -type f -name virtualenvwrapper.sh)
此时 virtualenvwrapper 就可以使用了; 对于Windows, 可以使用 virtualenvwrapper-win 或者安装:sudo easy_install virtualenvwrapper
此时还不能使用virtualenvwrapper,默认virtualenvwrapper安装在/usr/local/bin下面,实际上你需要运行virtualenvwrapper.sh文件才行。
先别急,打开这个文件看看,里面有安装步骤,我们照着操作把环境设置好。
创建目录用来存放虚拟环境
mkdir $HOME/.virtualenvs
在~/.bashrc中添加行: export WORKON_HOME=$HOME/.virtualenvs
在~/.bashrc中添加行:source /usr/local/bin/virtualenvwrapper.sh
运行: source ~/.bashrc
此时virtualenvwrapper就可以使用了。
virtualenvwrapper-win
在 Windows环境中使用 "virtualenvwrapper-win" 还是比较方便的。
安装。同样使用 pip 进行安装:pip install virtualenvwrapper-win
常用命令。安装完成之后,就可以直接使用 "virtualenvwrapper-win" 提供的命令来创建虚拟环境了。
1. 新建虚拟环境:mkvirtualenv env_name
C:\Users\tianw1>mkvirtualenv py27_dev1
New python executable in py27_dev1\Scripts\python.exe
Installing setuptools, pip, wheel...done.(py27_dev1) C:\Users\tianw1>pip list
pip (7.1.2)
setuptools (18.2)
wheel (0.24.0)
注意,默认情况虚拟环境不会自通引用原始 Python 环境中的软件包,但是可以通过 "--system-site-packages" 参数来使虚拟环境引用原始 Python 环境中的软件包。
C:\Users\tianw1>mkvirtualenv --system-site-packages py27_dev2
New python executable in py27_dev2\Scripts\python.exe
Installing setuptools, pip, wheel...done.
(py27_dev2) C:\Users\tianw1>pip list
2. 离开虚拟环境:deactivate
(py27_dev1) C:\Users\tianw1>deactivate
C:\Users\tianw1>
3. 列出虚拟环境列表:workon 或 lsvirtualenv
C:\Users\tianw1>workon
Pass a name to activate one of the following virtualenvs:
==============================================================================
py27_dev1
py27_dev2C:\Users\tianw1>lsvirtualenv
dir /b /ad "C:\Users\tianw1\Envs"
==============================================================================
py27_dev1
py27_dev2C:\Users\tianw1>
4. 删除虚拟环境:rmvirtualenv env_name
2.3 Python3 venv 创建 虚拟环境
venv — Creation of virtual environments — Python 3.10.1 documentation
Python3.3 以上的版本通过 venv 模块 原生支持虚拟环境,可以代替 Python之前的 virtualenv。该 venv模块 提供了创建轻量级“虚拟环境”,提供与系统 python 的隔离支持。每一个虚拟环境都有其自己的 Python二进制(允许有不同的Python版本创作环境),并且可以拥有自己独立的一套 Python包。
首先,我们先在某个目录下( 根目录 或者 桌面,关键是下次要用能够找得到),输入:
$ python3 -m venv XXX
XXX 指你要创建的文件名。因为在执行这行命令之后,就会把与 Python 虚拟环境有关的文件放到 XXX 里面。
之后只需要运行这个里面的 activate 文件就行。Linux下的命令如下:
$ source <XXX>/bin/activate
Windows 的 cmd 下是:
C:> <XXX>/Scripts/activate.bat
在PowerShell下是:
PS C:> <venv>/Scripts/Activate.ps1
但是为了避免运行不信任的脚本,PowerShell 下此脚本可能被禁止。此时输入命令:
set-executionpolicy remotesigned
然后更改执行策略就可以了。
退出环境之前输入:
$ deactivate