Python 的 sys.path 从哪里初始化?[重复]
- 2025-01-10 08:47:00
- admin 原创
- 11
问题描述:
Python 的 sys.path 从哪里初始化?
UPD:Python 在引用 PYTHONPATH 之前添加了一些路径:
>>> import sys
>>> from pprint import pprint as p
>>> p(sys.path)
['',
'C:\\Python25\\lib\\site-packages\\setuptools-0.6c9-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\orbited-0.7.8-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\morbid-0.8.6.1-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\demjson-1.4-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\stomper-0.2.2-py2.5.egg',
'C:\\Python25\\lib\\site-packages\/uuid-1.30-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\stompservice-0.1.0-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\cherrypy-3.0.1-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\pyorbited-0.2.2-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\flup-1.0.1-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\wsgilog-0.1-py2.5.egg',
'c:\\testdir',
'C:\\Windows\\system32\\python25.zip',
'C:\\Python25\\DLLs',
'C:\\Python25\\lib',
'C:\\Python25\\lib\\plat-win',
'C:\\Python25\\lib\\lib-tk',
'C:\\Python25',
'C:\\Python25\\lib\\site-packages',
'C:\\Python25\\lib\\site-packages\\PIL',
'C:\\Python25\\lib\\site-packages\\win32',
'C:\\Python25\\lib\\site-packages\\win32\\lib',
'C:\\Python25\\lib\\site-packages\\Pythonwin']
我的 PYTHONPATH 是:
PYTHONPATH=c: estdir
我想知道 PYTHONPATH 之前的那些路径来自哪里?
解决方案 1:
编辑
当我在 2015 年写这篇文章时,还没有关于这个主题的文档。现在有评论了,如果你想看看的话。在代码库的评论中也有对该算法的散文解释getpath.py
。我仍然相信我的回答是相关的,并且相对最新。
原文如下
Python 确实在努力智能地设置sys.path
。如何设置 可能会变得非常 复杂。以下指南是一份精简版、有些不完整、有些错误但希望有用的指南,供普通 Python 程序员使用,它说明了当 Python 确定在普通Python 安装中将、
、和的初始值用作什么时会发生什么
。sys.path
`sys.executablesys.exec_prefix
sys.prefix`
首先,python 会尽最大努力根据操作系统的指示找出它在文件系统上的实际物理位置。如果操作系统只是说“python”正在运行,它会在 $PATH 中找到自己。它会解析任何符号链接。完成此操作后,它找到的可执行文件的路径将用作 的值sys.executable
,没有 ifs、ands 或 buts。
sys.exec_prefix
接下来,它确定和的
初始值sys.prefix
。
pyvenv.cfg
如果在同一个目录或上一个目录中
有一个名为的文件sys.executable
,python 会查看它。不同的操作系统对这个文件的操作不同。
python 查找的此配置文件中的一个值是配置选项。Python 稍后
动态设置 的初始值时home = <DIRECTORY>
将使用此目录,而不是包含 的目录。如果Windows 上的文件中出现了该设置
,但没有出现该设置,则将设置为包含 的目录。sys.executable
`sys.prefixapplocal = true
pyvenv.cfghome = <DIRECTORY>
sys.prefix`sys.executable
接下来,PYTHONHOME
检查环境变量。在 Linux 和 Mac 上,sys.prefix
和sys.exec_prefix
被设置为PYTHONHOME
环境变量(如果存在),取代中的任何home = <DIRECTORY>
设置pyvenv.cfg
。在 Windows 上,sys.prefix
和sys.exec_prefix
被设置为PYTHONHOME
环境变量(如果存在),除非home = <DIRECTORY>
中存在设置,否则pyvenv.cfg
将改用该设置。
否则,从 的位置或给出的目录(如果有)向后走找到这些sys.prefix
和。sys.exec_prefix
`sys.executablehome
pyvenv.cfg`
如果在目录或其任何父目录中找到该文件,则在 Linux 或 Mac 上lib/python<version>/dyn-load
将该目录设置为
。如果在目录或其任何子目录中找到该文件,则在 Linux、Mac 和 Windows 上将该目录设置为,并将设置为与Windows 上
相同的值
。如果设置了,则在 Windows 上将跳过整个步骤。要么使用目录,要么如果在中设置了,则改为使用目录作为初始值。sys.exec_prefix
`lib/python<version>/os.pysys.prefix
sys.exec_prefixsys.prefix
applocal = truesys.executable
homepyvenv.cfg
sys.prefix`
如果找不到这些“地标”文件或sys.prefix
尚未找到,则 python 会将其设置为“后备”值。例如,Linux 和 Mac 使用预编译的默认值作为和 的sys.prefix
值。Windows 会等到完全确定后再为 设定后备值
。sys.prefix
`sys.exec_prefixsys.path
sys.prefix`
然后,(你们一直在等待的)python 确定要包含在中的初始值sys.path
。
将 python 正在执行的脚本的目录添加到
sys.path
。在 Windows 上,这始终是空字符串,它告诉 python 使用脚本所在的完整路径。如果设置了 PYTHONPATH 环境变量的内容,则会将其添加到
sys.path
,除非您使用的是 Windows 并applocal
在 中将其设置为 truepyvenv.cfg
。<prefix>/lib/python35.zip
在 Linux/Mac 和
Windows 上的zip 文件路径os.path.join(os.dirname(sys.executable), "python.zip")
被添加到sys.path
。如果在 Windows 上,且
applocal = true
中未设置,则将添加pyvenv.cfg
注册表项的子项的内容
(如果有)。HK_CURRENT_USERSoftwarePythonPythonCore<DLLVersion>PythonPath
如果在 Windows 上,且
applocal = true
在中未设置pyvenv.cfg
,且sys.prefix
找不到,则添加注册表项的核心内容(如果存在);HK_CURRENT_USERSoftwarePythonPythonCore<DLLVersion>PythonPath
如果在 Windows 上,且
applocal = true
中未设置,则将添加pyvenv.cfg
注册表项的子项的内容
(如果有)。HK_LOCAL_MACHINESoftwarePythonPythonCore<DLLVersion>PythonPath
如果在 Windows 上,且
applocal = true
在中未设置pyvenv.cfg
,且sys.prefix
找不到,则添加注册表项的核心内容(如果存在);HK_CURRENT_USERSoftwarePythonPythonCore<DLLVersion>PythonPath
如果在 Windows 上,未设置 PYTHONPATH,未找到前缀,并且不存在注册表项,则会添加 PYTHONPATH 的相对编译时值;否则,将忽略此步骤。
编译时宏 PYTHONPATH 中的路径是相对于动态找到的路径添加的
sys.prefix
。在 Mac 和 Linux 上,会添加 的值
sys.exec_prefix
。在 Windows 上,会添加用于(或将用于)动态搜索的目录sys.prefix
。
此时,在 Windows 上,如果未找到前缀,则 Python 将尝试通过搜索中的所有目录来查找sys.path
地标文件,就像它之前尝试对 的目录所做的那样sys.executable
,直到找到某个文件为止。如果没有找到,sys.prefix
则保留为空白。
最后,完成所有这些后,Python 会加载site
模块,该模块会进一步添加内容sys.path
:
它首先从头部分和尾部分构建最多四个目录。对于头部分,它使用
sys.prefix
和sys.exec_prefix
;跳过空头。对于尾部分,它使用空字符串和然后lib/site-packages
(在 Windows 上)或lib/pythonX.Y/site-packages
和然后lib/site-python
(在 Unix 和 Macintosh 上)。对于每个不同的头尾组合,它查看它是否引用现有目录,如果是,则将其添加到 sys.path 并检查新添加的配置文件路径。
编辑:自2021 年 12 月以来,不再有(复杂getpathp.c
单词开头的链接),因为实现已移植到 Python:getpath.py
解决方案 2:
“从环境变量 PYTHONPATH 初始化,加上安装相关的默认值”
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件