~/.local/lib/pyt-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 01:47:37 25 4
gpt4 key购买 nike

在用户站点中,.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

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

最佳答案

看起来这一切都发生在 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 .

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

至于这种行为的意图是什么,有note :

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

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

也许可以用不同的方式解决这个问题,这样路径配置文件就不会加载两次。

关于python - 为什么 .pth 文件在 Python 虚拟环境中加载两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58807569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com