Python 如何找到 sys.prefix (resp. sys.base_prefix) 的值?

Jef*_*men 5 python unix

罐头上写的是什么。

我已经解开了sys.prefix使用虚拟环境时如何设置的谜团(Python 查找pyvenv.cfg文件 [ 1 ])。

但是,我不明白 Python 是如何找到sys.base_prefix.
默认值为/usr/local(在 Unix 上)[ 2 ]。
但是,这似乎对我的 Mac 无效。

正如下面的代码所示,符号链接被跟随,在这种情况下,sys.base_prefix它只是实际 Python 二进制文件上方的目录:

# Following symlinks to determinw where the actual hard link is
?  tmp ls -l /usr/local/bin/python3
lrwxr-xr-x  1 jeffhemmen  admin  38 23 Jul 12:23 /usr/local/bin/python3 -> ../Cellar/python@3.8/3.8.5/bin/python3
?  tmp ls -l /usr/local/Cellar/python@3.8/3.8.5/bin/python3
lrwxr-xr-x  1 jeffhemmen  staff  55 20 Jul 14:26 /usr/local/Cellar/python@3.8/3.8.5/bin/python3 -> ../Frameworks/Python.framework/Versions/3.8/bin/python3
?  tmp ls -l /usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/bin/python3
lrwxr-xr-x  1 jeffhemmen  staff  9 20 Jul 14:26 /usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/bin/python3 -> python3.8
?  tmp ls -l /usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/bin/python3.8
-rwxr-xr-x  1 jeffhemmen  staff  17704 23 Jul 12:23 /usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/bin/python3.8
# Printing sys.base_prefix for all these links
?  tmp /usr/local/bin/python3 -c "import sys; print(sys.base_prefix)" 
/usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8
?  tmp /usr/local/Cellar/python@3.8/3.8.5/bin/python3 -c "import sys; print(sys.base_prefix)"  
/usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8
?  tmp /usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/bin/python3 -c "import sys; print(sys.base_prefix)"
/usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8
?  tmp /usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8/bin/python3.8 -c "import sys; print(sys.base_prefix)"
/usr/local/Cellar/python@3.8/3.8.5/Frameworks/Python.framework/Versions/3.8
Run Code Online (Sandbox Code Playgroud)

但是,在下面的示例中(同一台计算机,我的 Mac),sys.base_prefix则完全不同:

?  tmp ls -l /usr/bin/python3 
-rwxr-xr-x  1 root  wheel  31488 10 Aug 21:56 /usr/bin/python3
?  tmp /usr/bin/python3 -c "import sys; print(sys.base_prefix)" 
/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7
Run Code Online (Sandbox Code Playgroud)

我在某处读到这取决于 Python 的安装方式。这是否意味着sys.base_prefix实际上已编译为二进制文件?如果没有,是否有 Python 在启动时读取的文本文件(config、.py、...)?

额外问题:何时/如何/为什么sys.exec_prefix实际上与sys.prefix(和/或sys.base_exec_prefix与 sys.base_prefix`)不同?

Fra*_*lin 1

文档解释了如何设置这些值以及虚拟环境如何覆盖它。

这是sys 模块的源代码,它似乎是在解释器状态初始化时设置的。我没有继续沿着这条路走下去。