在用户站点中,.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
为什么在虚拟环境中两次处理路径配置文件?
答案 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,那么这很重要。
也许可以用其他方法解决问题,以使路径配置文件不会加载两次。