【转载】Python中的虚拟环境(Virtualenv)及其工作原理

也许Python由于2和3的分裂,Python发展出了虚拟环境(virtualenv)的技术。 还有一个原因——可能这才是主要原因——Python的包只能同时安装一个版本。 这种行为是学自系统包管理器。 对系统来说,一个包安装一个版本就够了。 但是对一个开发多个复杂项目的环境来说,只有像Java系的Maven库那样,多个版本同时保留,依赖检查延迟到打包时,才能确保并行开发。 否则,A项目需要S软件的1.0版本,B项目需要它的2.0,这就没法一起玩了。

virtualenv的关键词是隔离(Isolation)。 它能创造一个包含特定版本的Python环境,并且确保Python软件包非常干净。 它创造性地使用了一些Shell和Python原有的机制,实现了虚拟环境的功能。

因此,开发每个Python项目时,都推荐创建对应的virtualenv来隔离开发。 这样可以不受系统Python软件包的影响,安装任意包的任意版本,并且最终能通过pip freeze > requirements.txt获取依赖列表。 (当然,这个列表通常需要裁剪。)

安装virtualenv

使用aptyum等包管理器安装的版本老旧,推荐使用pip安装。

pip3 install --user virtualenv

准备virtualenv

每个项目,都需要独立创建一个(或多个)虚拟环境,隔离开发。

virtualenv -p python3 venv

-p是显式指定Python版本,避免使用默认的python。 虚拟环境的常用名,可选择envvenv.env.venv。 venv是PyCharm的默认虚拟环境名称。

激活virtualenv

默认使用的是用户+系统环境,激活后才是虚拟环境。

source venv/bin/activate

激活虚拟环境后,可以看到只有三个Python包。 这个环境可以随意使用,所有安装都会在./venv/下,不会影响系统环境。 干净的环境,也能帮助开发人员确认依赖。

$ pip list
Package    Version
---------- -------
pip        19.0.3
setuptools 40.8.0
wheel      0.33.1

在这个虚拟环境中,python就是python3,而系统环境的python通常是python2。 在安装软件时,直接使用pip,即可安装到虚拟环境中。 而不像一般状态下,要么加sudo提权([brew]或Windows环境下不用),要么安装时需要加--user,安装到用户目录下。

以下是系统、用户、虚拟环境三种方式安装,以及可执行文件pylint被安装的位置。

$ sudo pip install pylint
$ ls /usr/local/bin/pylint
/usr/local/bin/pylint

$ pip install --user pylint
$ ls ~/.local/bin/pylint
/home/user/.local/bin/pylint

$ source venv/bin/activate
$ pip install pylint
$ ls venv/bin/pylint
venv/bin/pylint

退出virtualenv

deactivate

退出后,回到用户+系统环境。