【发布时间】:2012-01-15 16:42:04
【问题描述】:
我检查了 activate 脚本,在我看来它所做的只是:
- 设置 VIRTUAL_ENV 环境
- 在 PATH 前面附加 $VIRTUAL_ENV/bin
virtualenv 如何通过这些提供神奇的虚拟环境?我错过了什么?
【问题讨论】:
标签: python virtualenv
我检查了 activate 脚本,在我看来它所做的只是:
virtualenv 如何通过这些提供神奇的虚拟环境?我错过了什么?
【问题讨论】:
标签: python virtualenv
我将描述我从@jcollado 链接到的演示文稿中学到的基本过程。
当 Python 启动时,它会查看二进制文件的路径及其前缀。
假设你的 virtualenv 是/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 或类似的东西。
virtualenv myenv 创建一个新的virtualenv。这将创建一个名为 myenv 的目录并将系统 python 二进制文件复制到 myenv/bin。它还将其他必要的文件和目录添加到 myenv,包括 bin/activate 中的设置脚本和用于模块和包的 lib 子目录。
. myenv/bin/activate 获取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 从 virtualenv 安装新软件包时,它们将安装在 myenv/lib/pythonX .Y
【讨论】:
../lib/pythonX.Y 甚至与sys.prefix 等相关的其他内容的秘密路径?
mkdir /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”。