virtualenv如何运作?

Dra*_*uan 53 python virtualenv

我检查了激活脚本,它看起来我所做的一切是:

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

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

Max*_*Max 51

我将描述基本过程,我从@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
Run Code Online (Sandbox Code Playgroud)

它停在/home/blah/scratch/lib/pythonX.Y/os.py因为它是第一个实际存在的文件.如果没有,Python会继续寻找.然后sys.prefix基于此设置.它使用类似的过程进行设置sys.exec_prefix,然后sys.path根据这些过程构建.

  • 感谢您在答案正文中清楚地说明问题,而不是链接到将来可能更改或消失的外部来源。 (2认同)

jco*_*ado 24

这是关于这个主题的非常好的演示.基本上,它解释了virtualenv使用Ian Bicking用于编写它的相同技巧来编写自己的步骤.


cla*_*800 13

  1. 首先,用户使用该命令创建一个新的virtualenv virtualenv myenv.这将创建一个名为myenv的目录,并将系统python二进制文件复制到myenv/bin.它还为myenv添加了其他必要的文件和目录,包括bin/activate中的安装脚本和模块和包的lib子目录.
  2. 然后用户使用激活脚本来源. myenv/bin/activate,它将shell的PATH环境变量设置为以myenv/bin开头.
  3. 现在当用户python从这个shell 运行时,它将执行存储在myenv/bin中的二进制文件的副本.尽管二进制文件与/ usr/bin/python中的二进制文件相同,但标准python二进制文件旨在搜索与二进制文件路径相关的目录中的包和模块(此功能与virtualenv无关).它在../lib/pythonX.Y中查找,其中X和Y是python二进制文件的主要和次要版本号.所以现在它正在寻找myenv/lib/pythonX.Y.
  4. myenv /箱目录中还包含一个名为脚本pip,这样当用户安装使用PIP从virtualenv中新的软件包,它们将被安装在myenv/lib目录/ pythonX.Y

  • 我想知道你们在哪里知道“../lib/pythonX.Y”之类的秘密路径,甚至与“sys.prefix”等相关的其他内容? (2认同)
  • 我还没有看到任何关于它的好的文档,但我在从源代码构建 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`. 然后输入“导入系统;sys.前缀`。这将显示“/tmp”。如果删除 /tmp/lib 目录,它将恢复为“/usr”。 (2认同)
  • 第3步是我缺少的关键点-python二进制文件在其可执行文件的邻域中查找关联文件。谢谢。 (2认同)