★本文是正在编写的书稿选登,先睹为快。 ”
11.5 创建虚拟环境
在实际的项目中,是不是一定要用“最新版”的模块或包呢?不一定。实际的项目要求往往比较复杂,比如有一个比较“古老的”网站项目中使用了 Django 2.2(参阅第12章12.3节),现在又要新建一个网站,要求使用 Django 3 。如此,在本地计算机的开发环境中就出现了同一个包的不同版本冲突,如何解决?
我们希望是每个项目都有相对独立的开发环境,与系统配置、其他项目的配置之间相隔离,从而能在该项目中“为所欲为”。这种相对独立的开发环境就是 Python 中的虚拟环境(Virtual Environment)。
在 Python 标准库中已经提供了创建虚拟环境的模块 venv
,下面就应用此模块演示创建虚拟环境的过程。
虚拟环境,其表现是一个目录,首先要创建此目录。以下演示中,准备将虚拟环境的目录放在 /Users/qiwsir/Documents/my_books/codes
内,并且虚拟环境目录的名称是 myvenv
。然后执行:
% python -m venv /Users/qiwsir/Documents/my_books/codes/myvenv
为了避免那么长的路径,可以先进入到目录 ../codes
内,再执行:
% python -m venv myvenv
同样也是在 ../codes
目录内创建了一个名为 myvenv
的子目录,这就是虚拟环境目录。
进入到 myvenv
子目录中:
qiwsir@qiwsirs-MacBook-Pro codes % cd myvenv
qiwsir@qiwsirs-MacBook-Pro myvenv % ls
bin include lib pyvenv.cfg
指令 ls
是 Linux 命令,即查看本目录中的文件和子目录(用 Windows 操作系统的用户不能照抄此命令,改用 dir
,并且显示出的目录名称可能稍有差别),发现这个目录里面非空,而是已经有了基本配置。
在子目录 bin
中( Windows 系统是 Scripts
),会看到如下内容:
qiwsir@qiwsirs-MacBook-Pro myvenv % cd bin
qiwsir@qiwsirs-MacBook-Pro bin % ls
Activate.ps1 activate.csh easy_install pip pip3.9 python3
activate activate.fish easy_install-3.9 pip3 python python3.9
这说明此虚拟环境已经配置了 Python 3.9 ,这是因为在创建虚拟环境的时候,指令 python
即 Python 3.9 。
在子目录 lib
中,读者会发现有 ./python3.9/site-packages
子目录( Windows 系统上是 Libsite-packages
),以后在本虚拟环境中安装的第三方包都会放在这里。
下面启动虚拟环境(没启动不能用),执行如下操作(目前在 ./myeven
目录中):
qiwsir@qiwsirs-MacBook-Pro myvenv % source ./bin/activate
(myvenv) qiwsir@qiwsirs-MacBook-Pro myvenv %
执行了 source ./bin/activate
指令之后,当前的命令行前面出现了 (myvenv)
,表示已经进入了(或者已经启动了)myvenv
虚拟环境。
(myvenv) qiwsir@qiwsirs-MacBook-Pro myvenv % pip list
Package Version
---------- -------
pip 20.2.3
setuptools 49.2.1
WARNING: You are using pip version 20.2.3; however, version 21.2.1 is available.
You should consider upgrading via the '/Users/qiwsir/Documents/my_books/codes/myvenv/bin/python -m pip install --upgrade pip' command.
由上述操作发现,当前虚拟环境中除了列出来的两项,尚未安装其它模块,并且此环境中的 pip 版本是 20.2.3 。在11.4.1节,已经将本地计算机系统所安装的 pip 升级到 21.2.1 ,而此处还是 Python 3.9 默认的 pip 版本,由此可见,虚拟环境相对系统环境是隔离的。
代码语言:javascript复制(myvenv) qiwsir@qiwsirs-MacBook-Pro myvenv % pip install django
Collecting django
Downloading Django-3.2.5-py3-none-any.whl (7.9 MB)
|████████████████████████████████| 7.9 MB 1.1 MB/s
Collecting pytz
Using cached pytz-2021.1-py2.py3-none-any.whl (510 kB)
Collecting asgiref<4,>=3.3.2
Downloading asgiref-3.4.1-py3-none-any.whl (25 kB)
Collecting sqlparse>=0.2.2
Downloading sqlparse-0.4.1-py3-none-any.whl (42 kB)
|████████████████████████████████| 42 kB 509 kB/s
Installing collected packages: pytz, asgiref, sqlparse, django
Successfully installed asgiref-3.4.1 django-3.2.5 pytz-2021.1 sqlparse-0.4.1
在这个虚拟环境中安装了 Django 3.2.5 ——记住这个安装方法,在第12章12.3节会用到。
如果不在 myvenv
目录里面,是不是就意味着退出了虚拟环境?
(myvenv) qiwsir@qiwsirs-MacBook-Pro myvenv % cd
(myvenv) qiwsir@qiwsirs-MacBook-Pro ~ %
并没有,只要前面还显示 (myvenv)
标记,就意味着仍然在该虚拟环境中,不论处于哪个目录中,即使在上述所示的位置,如果安装第三方包,也被安装到虚拟目录里面。
(myvenv) qiwsir@qiwsirs-MacBook-Pro ~ % pip install Flask
安装了另外一个常用于 web 项目开发的框架 Flask ,然后查看一下在当前虚拟环境中已经具有的第三方包。
代码语言:javascript复制(myvenv) qiwsir@qiwsirs-MacBook-Pro ~ % pip list
Package Version
------------ -------
asgiref 3.4.1
click 8.0.1
Django 3.2.5
Flask 2.0.1
itsdangerous 2.0.1
Jinja2 3.0.1
MarkupSafe 2.0.1
pip 20.2.3
pytz 2021.1
setuptools 49.2.1
sqlparse 0.4.1
Werkzeug 2.0.1
虽然前面仅仅演示安装了两个,由于这两个包都是 web 开发框架,它们还有一些依赖的包,也一同自动安装了。以上显示的就是当前虚拟环境中已经具有包和模块——这点内容远远少于本地计算机系统中所安装的包。
有了一个相对独立的环境后,在此环境内进行各项开发,就避免了不同项目之间的干扰。关于更详细的开发过程,参阅第12章有关章节内容。
当虚拟环境中的工作结束了,就必须退出,基本操作是:
代码语言:javascript复制(myvenv) qiwsir@qiwsirs-MacBook-Pro ~ % deactivate
qiwsir@qiwsirs-MacBook-Pro ~ %
现在没有了 (myvenv)
标记,回到了系统环境中。
★自学建议 到目前为止,读者已经学完了 Python 的基础知识,这些知识虽然已经能够支持一般的项目开发,但我认为重点不在于此,而在于通过借助本书学习,自学能力得到了培养和提升,才是最大的收获。从此之后,读者面对项目中所遇到的任何新知识,都有有信心和能力快速掌握。 ”