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

标签 python unix

jar 头上写的是什么。
我已解开谜底sys.prefix在使用虚拟环境时设置(Python 查找 pyvenv.cfg 文件 [ 1 ])。
但是,我不明白 Python 是如何找到 sys.base_prefix 的。 .
默认为 /usr/local (在 Unix 上)[ 2 ]。
但是,这似乎对我的 Mac 无效。
如下面的代码所示,遵循符号链接(symbolic link),在这种情况下是 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
但是,在下面的示例中(同一台计算机,我的 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
我在某处读到这取决于 Python 的安装方式。这是否意味着 sys.base_prefix居然编译成二进制?如果没有,是否有 Python 在启动时读取的文本文件(config、.py、...)?
奖金问题:何时/如何/为什么是 sys.exec_prefix实际上不同于sys.prefix (和/或 sys.base_exec_prefix 来自 sys.base_prefix`)?

最佳答案

documentation解释了如何设置这些值以及虚拟环境如何覆盖它。
这是source code对于 sys 模块,它似乎是在解释器状态初始化时设置的。我没有进一步走这条路。

关于python - Python 如何找到 sys.prefix (resp. sys.base_prefix) 的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64247900/

相关文章:

matlab - 如何在 MATLAB 或 Unix shell 中查看 .mat 文件?

python - 我想添加一个可以加载下一个图像文件并将其显示到 Canvas 的按钮

python - 选择在哪个桌面 Tkinter.Tk() 打开新窗口

linux - 创建一个ruser和user不同的进程

linux - 参数列表过长时如何正确使用 "xargs"

c - 在 unix 上读取文件时如何解决退出代码 139 错误

c++ - 我想知道我们使用的ide是否包含链接器

python - 无法在自定义编码器中将字典编码为 JSON

Python单元测试检查函数调用参数

python - 如果未定义模式,pystache 可以告诉我吗?