Python虚拟环境-virtualenv介绍

什么是环境

环境是解释器在运行时所需的头文件,库等的集合,是一个文件夹。这个概念跟函数闭包有点像,闭包携带了函数运行所需的所有变量。
比如python安装目录就是一个环境,其下包含:

  • Include - 头文件所在位置
  • Lib - 库文件所在位置
  • Scripts - python应用所在位置
  • tcl - 目前我还不知道
  • 还有其他文件夹我也不知道了

注:pip安装的包在\Lib\site-packages

为什么需要虚拟环境

The basic problem being addressed is one of dependencies and versions, and indirectly permissions. Imagine you have an application that needs version 1 of LibFoo, but another application requires version 2. How can you use both these applications? If you install everything into /usr/lib/python2.7/site-packages (or whatever your platform’s standard location is), it’s easy to end up in a situation where you unintentionally upgrade an application that shouldn’t be upgraded.
Or more generally, what if you want to install an application and leave it be? If an application works, any change in its libraries or the versions of those libraries can break the application.

假如你只使用python安装时提供的环境,对于环境的任何修改都只能叠加到这个环境上。
比如某个python app需要某个Lib的v1版本,但另一个app需要这个Lib的v2版本。因为这两个版本不可能在同一个环境上同时出现,所以这两个app不能同时使用。
另外某些造好的轮子需要依托固定版本的库,如果手贱一不小心升级了,这个轮子就不能用了
以上都是单一环境的坏处。
所以virtualenv可以虚拟出多个环境,解决这个问题。

安装virtualenv

POSIX系统下安装virtualenv直接看官网教程[1]即可。
这里多说一下Windows系统下的安装:

1
python -m pip install virtualenv

注:貌似Windows的cmd下python应用的运行都需要在前面加python -m

-m mod : run library module as a script (terminates option list)

安装完毕后将%你的python安装位置%\Scripts加入PATH(执行完命令后,cmd应该会直接提示你将这个路径加入PATH)

创建虚拟环境

POSIX系统看官网教程就可以了
比如我这里创建名字为ENV的虚拟环境:
Windows系统在cmd中运行:

1
python -m virtualenv ENV

此时会在当前路径下创建ENV文件夹,里面包含:

  • Include
  • Lib
  • Scripts
  • tcl

是不是跟之前提到的很像!

虽然创建了虚拟环境,但系统并不知道虚拟环境的存在。通过运行\ENV\Scripts下的activate.bat(在命令行中运行,不要双击)就可以激活该虚拟环境,所有操作都在该虚拟环境中运行。

cmd

可以看到,运行完该脚本后,命令行进入了webdevelopment虚拟环境,系统很贴心地在前面标注了虚拟环境的名称。此时在命令行中对python做的所有操作都被局限在该虚拟环境中。此时包也会安装到这个文件夹里的\Lib\site-packages而不是python安装位置的文件夹里了。

退出虚拟环境运行\Scripts下的deactivate.bat

多说几句

虚拟环境中包含了\Scripts\python.exe,在激活虚拟环境后,activate.bat脚本在命令行的PATH的首位添加了C:\WINDOWS\system32\webdevelopment\Scripts;,可见此时\Scripts里面的所有命令都在虚拟环境中执行


  1. https://virtualenv.pypa.io/en/stable/ ↩︎

0%