【问题标题】:How does virtualenv work?virtualenv 是如何工作的?
【发布时间】:2012-01-15 16:42:04
【问题描述】:

我检查了 activate 脚本,在我看来它所做的只是:

  • 设置 VIRTUAL_ENV 环境
  • 在 PATH 前面附加 $VIRTUAL_ENV/bin

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

【问题讨论】:

标签: python virtualenv


【解决方案1】:

我将描述我从@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 或类似的东西。
  • 从来没有想过要为 sys.prefix 发现这个路径!
  • 感谢您在答案正文中清楚地解释,而不是链接到将来可能会改变或消失的外部来源。
  • 在这个答案之前,说明这一切的文档在哪里?即使这样也很难找到。
【解决方案2】:
  1. 首先,用户使用命令virtualenv myenv 创建一个新的virtualenv。这将创建一个名为 myenv 的目录并将系统 python 二进制文件复制到 myenv/bin。它还将其他必要的文件和目录添加到 myenv,包括 bin/activate 中的设置脚本和用于模块和包的 lib 子目录。
  2. 然后用户使用. myenv/bin/activate 获取activate 脚本,这会将shell 的PATH 环境变量设置为以myenv/bin 开头。
  3. 现在,当用户从这个 shell 运行 python 时,它将执行存储在 myenv/bin 中的二进制文件的副本。尽管二进制文件与 /usr/bin/python 中的二进制文件相同,但标准的 python 二进制文件旨在搜索与二进制文件路径相关的目录中的包和模块(此功能与 virtualenv 无关)。它在 ../lib/pythonX.Y 中查找,其中 X 和 Y 是 python 二进制文件的主要和次要版本号。所以现在它正在寻找 myenv/lib/pythonX.Y
  4. myenv/bin 目录还包含一个名为 pip 的脚本,因此当用户使用 pip 从 virtualenv 安装新软件包时,它们将安装在 myenv/lib/pythonX .Y

【讨论】:

  • 我想知道你们在哪里知道类似于../lib/pythonX.Y 甚至与sys.prefix 等相关的其他内容的秘密路径?
  • 我还没有看到任何关于它的好的文档,但是我在从源代码构建 Python 时注意到了这种行为。你也可以像这样测试它: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”。
  • 第 3 步是我遗漏的关键——python 二进制文件在它的可执行文件附近查找相关文件。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-06-22
  • 2014-02-11
  • 2021-02-22
  • 2018-05-25
  • 2014-12-31
  • 2016-09-23
  • 1970-01-01
  • 2012-11-17
相关资源
最近更新 更多