为什么在Python虚拟环境中两次加载.pth文件?

时间:2019-11-11 19:34:26

标签: python python-venv

在用户站点中,.pth文件在解释器启动时被处理一次:

$ echo 'import sys; sys.stdout.write("hello world\n")' > ~/.local/lib/python3.8/site-packages/hello.pth
$ python3.8 -c ""
hello world

这与系统站点中的行为相同,例如/usr/local/lib/python3.8/site-packages/

但是在venv中,它们会被处理 两次

$ rm ~/.local/lib/python3.8/site-packages/hello.pth
$ /usr/local/bin/python3.8 -m venv .venv
$ source .venv/bin/activate
(.venv) $ echo 'import sys; sys.stdout.write("hello world\n")' > .venv/lib/python3.8/site-packages/hello.pth
(.venv) $ python -c ""
hello world
hello world

为什么在虚拟环境中两次处理路径配置文件?

1 个答案:

答案 0 :(得分:3)

这一切似乎都发生在site模块中(并不奇怪)。特别是在site.main()函数中。

.pth文件的加载发生在site.addsitepackages()site.addusersitepackages()中,具体取决于文件放置在哪个文件夹中。更准确地说,这两个函数都调用site.addpackage()actually happens

在第一个示例中,在虚拟环境之外,该文件放置在用户站点包的目录中。因此,控制台输出发生在site.main() calls site.addusersitepackages()时。

在第二个示例中,在虚拟环境中,文件被放置在虚拟环境自己的站点包目录中。因此,控制台输出发生在site.main() calls site.addsitepackages() directly时,并且也通过site.venv()通过几行,如果site.addsitepackages(),即detects that the interpreter is running inside a virtual environment,也调用finds a pyvenv.cfg file。 / p>

简而言之:在虚拟环境site.addsitepackages()中运行两次。

关于此行为的意图是,有一个note

        # Doing this here ensures venv takes precedence over user-site
        addsitepackages(known_paths, [sys.prefix])

据我所知,如果虚拟环境已配置为允许system site packages,那么这很重要。

也许可以用其他方法解决问题,以使路径配置文件不会加载两次。