Python虚拟环境pyenv、venv(pyvenv)、virtualenv之间的区别,终于搞清楚了

  • Post author:
  • Post category:python

背景

问题1:
举个例子,tensorflow(tf)是一个十分流行的python机器学习库,你现在手里有两个tf项目,其中项目A需要使用python2.7 + f1.2,项目B需要使用python2.7 + tf1.6.这两个项目你得同时进行,怎么办?

愚蠢的办法是需要运行项目A时,将python2.7中的tf1.6卸载掉,安装tf1.2;需要运行项目B时,将python2.7中的tf1.2卸载掉,安装tf1.6。如果是单个模块还好,但是tf的不同版本又依赖于python中的其他已安装模块,而且tf1.2和tf1.6对依赖模块有不同的版本要求,那么转换一次得卸载安装好几个模块,是不是很爆炸?

问题2:
课题组里几个同门共用一台服务器,每个人拥有一个系统账户,其中只有一个人拥有root权限,里面每个人都需要使用python跑程序,而且每个人对python版本以及python模块的版本都有不同需求,很多人又没有root权限,如何解决?

1. python虚拟环境

python虚拟环境是一个隔离/独立的python开发环境,和系统python环境可以完全隔离,互不相关,相当于多了一个python开发环境。而且你在python虚拟环境中的开发过程和使用系统python一模一样,你可以在你创建的python虚拟环境中使用pip工具安装任何你需要的模块,该模块和系统python环境完全不相关。虚拟环境的这个特点就能解决上面的问题了。

1.1 安装虚拟环境

python有3个模块可以用于创建和管理python虚拟环境:

  • venv
  • virtualenv
  • pyvenv

其中,venv模块是Python3.3之后标准库自带的虚拟环境创建和管理工具,在一定程度上能够替代virtualenv。但venv是Python3.3才有的,Python2.X不能使用,而virtualenv同时支持Python2.X和Python3.X,特别是在当前的生产环境中Python2.X还占有很大比例的情况下我们依然需要virtualenv。

可以使用以下命令安装:

#安装venv
sudo apt install python3-venv
#安装virtualenv
pip install virtualenv
或者
sudo -H pip install virtualenv

安装好之后,就可以使用这两个工具安装python虚拟环境了。
注意:以上两种安装方式在安装虚拟环境的同时也自动安装了pip工具。

1.2 pyvenv脚本过时说明

在 *nix 系统上,可以直接执行 pyvenv /path/to/new/virtual/enviorment 来创建一个虚拟环境,在 Windows 系统上,则可以使用 python -m venv myenv 来创建。

pyvenv /path/to/new/virtual/environment

虚拟环境也能创建成功,但是会有一个warning。

尽管Python 3.7.3的bin目录下依然有pyvenv的脚本,但是在打印的help信息的第一行明确警告说:这个脚本是过时的,推荐使用 python3.7 -m venv命令。

注:主要原因是避免混淆新创建的虚拟环境到底用的是哪个Python解释器,使用python3.7 -m venv这个格式可以明确的指导使用的是当前调用的解释器。

注:PEP 405对Python的虚拟环境有详细说明。

[tony@tony-controller bin]$ ./pyvenv --help
WARNING: the pyenv script is deprecated in favour of `python3.7 -m venv`
usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear]
            [--upgrade] [--without-pip] [--prompt PROMPT]
            ENV_DIR [ENV_DIR ...]

Creates virtual Python environments in one or more target directories.

1.3 使用virtualenv

我的系统python版本有python2.7和python3.5,虚拟环境的python版本只能是系统中已有的python版本。使用virtualenv安装虚拟环境的命令如下:

#安装python2.7虚拟环境
virtualenv /home/yan/env 

什么参数都不指定的话,它会使用/usr/bin/python路径下的python解释器版本,即python2.7。因此会默认安装python2.7虚拟环境,/home/yan/env表示虚拟环境的安装路径。

如果你要安装的是python3.5的虚拟环境,可以这样:

#安装python3.5虚拟环境
virtualenv --python=python3.5 /home/yan/env3

一般情况下,上面两条命令就够了,这样安装得到的python虚拟环境和系统python环境是完全隔离的。

更多的命令选项可以在命令行中直接输入virtualenv命令获取。

1.4 使用venv

venv只有python3可以使用,因此只能创建python3的虚拟环境,创建命令如下:

python3 -m venv /home/yan/env3

其中,python3 -m venv是死命令,最后的安装路径自己指定。

venv命令的选项与pyvenv的选项一样,可以一次性同时创建多个虚拟环境。

# 创建两个虚拟环境
[tony@tony-controller bin]$ ./python3 -m venv /tmp/venv1_py37 /tmp/venv2_py37

# 查看虚拟环境目录
[tony@tony-controller bin]$ ls -l /tmp/venv*
/tmp/venv1_py37:
total 4
drwxrwxr-x. 2 tony tony 173 Apr 28 09:43 bin
drwxrwxr-x. 2 tony tony   6 Apr 28 09:43 include
drwxrwxr-x. 3 tony tony  23 Apr 28 09:43 lib
lrwxrwxrwx. 1 tony tony   3 Apr 28 09:43 lib64 -> lib
-rw-rw-r--. 1 tony tony  84 Apr 28 09:43 pyvenv.cfg

/tmp/venv2_py37:
total 4
drwxrwxr-x. 2 tony tony 173 Apr 28 09:43 bin
drwxrwxr-x. 2 tony tony   6 Apr 28 09:43 include
drwxrwxr-x. 3 tony tony  23 Apr 28 09:43 lib
lrwxrwxrwx. 1 tony tony   3 Apr 28 09:43 lib64 -> lib
-rw-rw-r--. 1 tony tony  84 Apr 28 09:43 pyvenv.cfg

# 选项帮助信息
[tony@tony-controller bin]$ ./python3 -m venv --help
usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear]
            [--upgrade] [--without-pip] [--prompt PROMPT]
            ENV_DIR [ENV_DIR ...]

Creates virtual Python environments in one or more target directories.

positional arguments:
  ENV_DIR               A directory to create the environment in.

optional arguments:
  -h, --help            show this help message and exit
  --system-site-packages
                        Give the virtual environment access to the system
                        site-packages dir.
  --symlinks            Try to use symlinks rather than copies, when symlinks
                        are not the default for the platform.
  --copies              Try to use copies rather than symlinks, even when
                        symlinks are the default for the platform.
  --clear               Delete the contents of the environment directory if it
                        already exists, before environment creation.
  --upgrade             Upgrade the environment directory to use this version
                        of Python, assuming Python has been upgraded in-place.
  --without-pip         Skips installing or upgrading pip in the virtual
                        environment (pip is bootstrapped by default)
  --prompt PROMPT       Provides an alternative prompt prefix for this
                        environment.

Once an environment has been created, you may wish to activate it, e.g. by
sourcing an activate script in its bin directory.

2. 激活虚拟环境

安装好虚拟环境之后,每次使用该虚拟环境前需要使用命令激活它。

2.1 linux下激活虚拟环境

假设前面我在/home/yan/env3/目录下安装了python3.5的虚拟环境,现在我使用source命令激活它:

source /home/yan/env3/bin/activate

激活之后,在命令行提示符前面会有(env3)的提示,表示当前你处的python虚拟环境,比如我电脑的情况:

yan@yanubuntu:~$ python3 -m venv /home/yan/env3
yan@yanubuntu:~$ source /home/yan/env3/bin/activate
(env3) yan@yanubuntu:~$ 

现在你可以在激活环境中干任何事情,比如使用pip命令在你新的python虚拟环境中安装模块:

pip install tensorflow
pip install opencv-python
pip install matplotlib
...

或者执行python脚本。

使用完该虚拟环境之后,你需要在命令行输入deactivate命令来退出该虚拟环境:

(env3) yan@yanubuntu:~$ deactivate
yan@yanubuntu:~$ 

之后就回到了正常的系统python环境中。

2.2 windows下激活虚拟环境

以上为在linux激活虚拟环境的方法,在Windows上需要执行activate.bat文件,如在windows下创建的虚拟环境目录为:C:\test\env,激活此虚拟环境需要找到Script文件夹下的activate.bat文件,如图
在这里插入图片描述
执行命令:
在这里插入图片描述
激活后在命令行提示符前面会有(env)的提示,表示当前已经处在虚拟环境中
在这里插入图片描述
退出虚拟环境则执行deactivate.bat,如图在这里插入图片描述

2.3 删除虚拟环境

由于你创建该虚拟环境的目的是为了跑某个项目的程序,现在该项目做完了,不需要该虚拟环境了,你可以把该虚拟环境直接删除,如何删?

直接将创建虚拟环境时生成的文件夹删掉,就这么简单。比如我要把我刚才创建的env3虚拟环境删除:

yan@yanubuntu:~$ rm -r /home/yan/env3
yan@yanubuntu:~$ 

在删除虚拟环境前记得一定得先退出该虚拟环境。

3. 在PyCharm中使用虚拟环境

有时候你都不知道自己在哪个python环境都装了些什么模块什么版本,但是在这里,你就可以很清晰的看到了,非常好用啊!原来我在PyCharm中没运行起来django是因为我这个虚拟环境里还没装django,装好以后就长下面这样,运行起来就没问题了!
在这里插入图片描述
怎么装?看这里:
可视化界面就是好用啊,搜一搜就出来了,也不怕命令行里模块名写错了
在这里插入图片描述

4.其他虚拟环境工具

为了解决包依赖、安装权限和 python 版本问题,程序员们制造了许多工具。除了以上介绍的虚拟环境创建工具还有如下几个,这里介绍的工具都是当前流行的,不会包含已经不再维护的工具。

virtualenvwrapper
顾名思义,virtualenvwrapper 是对 virtualenv 的一个封装,目的是使后者更好用。
关于为什么使用 shell 脚本开发,作者专门 进行了解释 。
virtualenvwrapper 还有针对 vim 用户和 emacs 用户的 扩展 。
virtualenvwrapper 能支持 bash/ksh/zsh ,所以我们可以看出,它不支持 Windows。

virtualenvwrapper-win
由于 virtualenvwrapper 基于 shell 开发,因此不能在 Windows 系统上使用。但我们可以使用针对 Windows batch shell 的 virtualenvwrapper-win。

5. Python版本环境切换工具

上面介绍的工具中,属于虚拟环境切换工具,下面再介绍几个 Python版本环境切换工具。将这两套工具结合使用,可以完美解决 python 多版本环境的问题。

pyenv

我们可以用许多方法让不同的 Python 版本在系统上共存。

例如在 OS X 上,如果使用官方提供的 DMG 版本安装,那么自带的 python2 和新安装的 python3 是可以共存的。python3 可以使用 python3 来调用,甚至 pip 都可以使用 pip3 来调用。

但如果还有其它小版本需要共存么?我要记忆多少命令呢?
pyenv 用来解决这类问题。
pyenv是第三方的、开源的多版本Python管理工具,用以管理在一台机器上多个Python发行版本的共存问题,比如一台Linux机器上同时安装Python2.7、Python3.4、Python3.5三个版本的管理。
它可以安装、卸载、编译、管理多个 python 版本,并随时将其中一个设置为工作环境。
pyenv 不支持 Windows 系统。

pywin

Windows 上有一个 pyenv 的替代品,是 pywin 。它用来在多个安装的 Python 版本之间进行切换,也支持 MSYS/MINGW32 。

Python Launcher for Windows

Python 从3.3版本开始(又是3.3?),在 Windows 系统中自带了一个 py.exe 启动工具。如果你是使用 Python.org 官网下载的安装包安装的 Python 3.3(或更新版本)环境,那么可以直接在命令提示符中使用这个工具。

py 可以打开默认的 python 提示符; py -2.7 和 py -3 打开对应的 Python 版本。

6. 总结

python虚拟环境的好处是:每个虚拟环境之间,以及虚拟环境和系统环境之间是完全隔离的,不同虚拟环境中,你可以安装不同版本的模块,就仿佛你可以同时拥有N多个不同的python开发环境。

唯一麻烦的一点是:每次进入某个虚拟环境之前,都要使用source命令激活。每次使用完,都要使用deactivate命令退出。

参考文献

https://docs.python.org/3/tutorial/venv.html.
https://docs.python.org/3/library/venv.html#module-venv.
https://virtualenv.pypa.io/en/latest/.
https://www.cnblogs.com/qinhan/p/9293126.html
https://blog.csdn.net/lanonjj/article/details/51050212
https://blog.zengrong.net/post/python_virtual_env/
https://www.jianshu.com/p/2fdb53825d35

zrong’s blog 《Python虚拟环境》 http://zengrong.net/post/2167.htm 强力推荐,讲得十分细致全面

关于pyenv 《Linux 下的 Python多版本管理(pyenv)》http://my.oschina.net/lionets/blog/267469

BASIN OF ATTRACTION 在Python3.4环境中使用pyvenv(即venv模块)替换Flask官方推荐的virtualenv的实践笔记 http://huangziwei.com/tech/pyvenv/


版权声明:本文为lovedingd原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。