我检查了activate脚本,它只做了以下几件事:
- 设置VIRTUAL_ENV环境变量
- 在PATH前面添加$VIRTUAL_ENV/bin
virtualenv
是如何通过这些步骤提供神奇的虚拟环境的?我错过了什么吗?
我检查了activate脚本,它只做了以下几件事:
virtualenv
是如何通过这些步骤提供神奇的虚拟环境的?我错过了什么吗?
我将描述基本过程,这些内容来自@jcollado链接的演示文稿。
当Python启动时,它会查看二进制文件的路径及其前缀。
假设您的虚拟环境为/home/blah/scratch
。Python进程知道它是从/home/blah/scratch/bin/python
执行的(通常只是系统Python二进制文件/usr/bin/python
的副本),并且它知道自己的版本X.Y
,因为它被编译到其中。然后Python按以下顺序查找lib/pythonX.Y/os.py
:
/home/blah/scratch/bin/lib/pythonX.Y/os.py
/home/blah/scratch/lib/pythonX.Y/os.py <-- this file should exist
/home/blah/lib/pythonX.Y/os.py
/home/lib/pythonX.Y/os.py
/lib/pythonX.Y/os.py
它停在/home/blah/scratch/lib/pythonX.Y/os.py
,因为这是实际存在的第一个文件。如果不存在,Python将继续寻找。然后,它基于此设置sys.prefix
。它使用类似的过程来设置sys.exec_prefix
,然后根据这些构建sys.path
。
X.X
源自Python版本,因此它将是2.7
或类似版本。 - Maxvirtualenv myenv
创建一个新的虚拟环境。这将创建一个名为myenv的目录,并将系统 Python 二进制文件复制到myenv/bin中。它还会在myenv中添加其他必要的文件和目录,包括bin/activate中的设置脚本和一个子目录lib,用于存放模块和软件包。. myenv/bin/activate
来激活脚本,这将把shell的PATH
环境变量设置为以myenv/bin开头。python
时,它将执行存储在myenv/bin中的二进制文件副本。即使该二进制文件与/usr/bin/python中的文件相同,但标准的Python二进制文件设计为搜索相对于二进制文件路径的目录中的软件包和模块 (此功能与 virtualenv 无关)。 它在../lib/pythonX.Y中查找,其中X和Y是Python二进制文件的主版本号和次版本号。现在,它正在查找myenv/lib/pythonX.Y目录下的组件。pip
的脚本,以便当用户使用虚拟环境中的pip安装新软件包时,它们将被安装在myenv/lib/pythonX.Y中。../lib/pythonX.Y
这样的秘密路径,以及其他与 sys.prefix
相关的内容? - Drake Guanmkdir /tmp/bin; mkdir /tmp/lib; cp /usr/bin/python /tmp/bin; cp -r /usr/lib/pythonX.Y/ /tmp/lib/pythonX.Y; /tmp/bin/python
。然后输入 import sys; sys.prefix
。这将显示“/tmp”。如果您删除/tmp/lib目录,则会恢复为“/usr”。 - clark800