virtualenv如何工作?

我检查了激活脚本,它看起来对我来说只是:

  • 设置VIRTUAL_ENV env
  • 在PATH前附加$ VIRTUAL_ENV / bin

virtualenv如何通过这些提供神奇的虚拟环境? 我错过了什么?

我将描述我从jcollado链接到的演示中学到的基本过程。

当Python启动时,它会查看二进制文件的path及其前缀。 所以我们说你的virtualenv是/home/blah/scratch 。 然后python二进制文件(只是你的系统python二进制文件的副本)将在/home/blah/scratch/bin/python 。 Python在/home/blah/scratch/bin/查找lib/pythonX.X/os.py ,然后在/home/blah/scratch/ /home/blah/scratch/lib/pythonX.X/os.py ,因为/home/blah/scratch/lib/pythonX.X/os.py存在。 如果没有,Python会继续寻找/home/blah/lib/pythonX.X/os.py ,等等。然后在这个基础上设置sys.prefix 。 它使用一个类似的过程来设置sys.exec_prefix ,然后在这些基础上构buildsys.path

这是一个关于这个主题的非常好的介绍 。 基本上,它解释了用Ian Bicking用来编写自己的virtualenv的步骤。

  1. 首先,用户使用virtualenv myenv命令创build一个新的virtualenv。 这将创build一个名为myenv的目录,并将系统python二进制文件复制到myenv / bin 。 它还向myenv添加了其他必要的文件和目录,包括bin / activate中的安装脚本和模块和软件包的lib子目录。
  2. 然后用户使用激活脚本. myenv/bin/activate . myenv/bin/activate ,它将shell的PATH环境variables设置为以myenv / bin开头。
  3. 现在,当用户从这个shell运行python ,它将执行存储在myenv / bin中的二进制文件的副本。 即使二进制文件与/ usr / bin / python中的二进制文件相同,标准的python二进制文件也可以search与二进制文件path相关的目录中的软件包和模块(这个function与virtualenv无关)。 它看起来在../lib/pythonX.Y其中X和Y是python二进制文件的主版本号和次版本号。 所以现在看在myenv / lib / pythonX.Y
  4. myenv / bin目录还包含一个名为pip的脚本,以便当用户使用virtualenv中的pip安装新软件包时,它们将安装在myenv / lib / pythonX.Y