两个从新安装的具有相同python36版本的相同暂存VM的sys.path值不同:
第一个虚拟机
[root@vm1 ~]# python36 -m site
sys.path = [
'/root',
'/usr/lib64/python36.zip',
'/usr/lib64/python3.6',
'/usr/lib64/python3.6/lib-dynload',
'/usr/lib64/python3.6/site-packages',
'/usr/lib/python3.6/site-packages',
]
USER_BASE: '/root/.local' (doesn't exist)
USER_SITE: '/root/.local/lib/python3.6/site-packages' (doesn't exist)
ENABLE_USER_SITE: True
第二个虚拟机
[root@vm2 ~]# python36 -m site
sys.path = [
'/root',
'/usr/lib64/python36.zip',
'/usr/lib64/python3.6',
'/usr/lib64/python3.6/lib-dynload',
'/usr/local/lib64/python3.6/site-packages',
'/usr/local/lib/python3.6/site-packages',
'/usr/lib64/python3.6/site-packages',
'/usr/lib/python3.6/site-packages',
]
USER_BASE: '/root/.local' (doesn't exist)
USER_SITE: '/root/.local/lib/python3.6/site-packages' (doesn't exist)
ENABLE_USER_SITE: True
由于某些原因,第二台VM具有/ usr / local / lib *路径。
两台机器上的os.environ显示相同的变量值:
原始PATH变量(如果将它们连接到PYTHONPATH,则不知道) 也是一样
[root @ vm1〜] env | grep -E“ ^ PATH =” PATH = / usr / local / sbin:/ usr / local / bin:/ usr / sbin:/ usr / bin:/ opt / java / latest / bin:/ opt / java / latest / jre / bin:/ root / bin
当在OS端未配置PYTHONPATH的自定义值时,python36如何在初始安装期间初始化PYTHONPATH(sys.path)?
答案 0 :(得分:0)
普通安装有望在没有任何PYTHONPATH
环境变量的情况下运行。如文档中所述,PYTHONPATH
在用户那里……
扩展模块文件的默认搜索路径。格式与Shell的PATH相同:一个或多个目录路径名,以os.pathsep分隔(例如Unix上的冒号或Windows上的分号)。不存在的目录将被静默忽略。
因此,没有一个标准的Python安装程序(包括在本地构建并运行make install
,以及Windows和macOS二进制安装程序都可以在python.org的“下载”下找到)来创建{{1} }或在您的环境中进行设置。而且大多数半官方和第三方软件包(如Python包含或由Linux发行版和Apple打包,在Downloads / Other下不太常见的平台安装程序,“电池加” Python发行版,如Anaconda等)都可以使用。同样的方式。
请注意,PYTHONPATH
目录已添加到默认搜索路径。如同一文档中所述:
默认搜索路径取决于安装,但通常以prefix / lib / pythonversion开头(请参见上面的PYTHONHOME)。它总是附加在PYTHONPATH上。
一个附加目录将被插入PYTHONPATH前面的搜索路径中,如上面“接口选项”下所述。可以从Python程序中将搜索路径作为变量sys.path进行操作。
sys.path
中也对此进行了解释:
一个字符串列表,它指定模块的搜索路径。从环境变量PYTHONPATH初始化,再加上依赖于安装的默认值。
在程序启动时初始化,此列表的第一项path [0]是包含用于调用Python解释器的脚本的目录。如果脚本目录不可用(例如,以交互方式调用解释器或从标准输入中读取脚本),则path [0]为空字符串,该字符串将引导Python首先搜索当前目录中的模块。请注意,由于PYTHONPATH的结果,脚本目录已插入条目之前。
...
另请参见模块
site
。这说明了如何使用.pth文件扩展sys.path。
与PYTHONPATH
不同,此PYTHONPATH
机制 有时由第三方和半官方安装使用。例如,Apple使用它将site
之类的Extras
预安装程序包库添加到macOS上的内置Python 2.7。
如果您想知道CPython中的pyobjc
模块如何加载“依赖于安装的默认值”,那么它最终可以归结为公共C API函数Py_GetPath
:
返回默认的模块搜索路径;这是根据程序名称(由上面的Py_SetProgramName()设置)和一些环境变量计算得出的。返回的字符串由一系列目录名称组成,这些目录名称由平台相关的分隔符分隔。在Unix和Mac OS X上,分隔符为':',';'在Windows上。返回的字符串指向静态存储;调用方不应修改其值。列表
sys
在解释器启动时使用此值进行初始化;以后可以(通常是)对其进行修改,以更改用于加载模块的搜索路径。
如果您想了解C代码的工作方式,您可能想从_PyPathConfig_Init
开始,因为实际的Py_GetPath
只是调用一个确保已被调用的函数,然后提取值超出了它设置的结构。