Python 的 sys.path 从哪里初始化?[重复]

2025-01-10 08:47:00
admin
原创
135
摘要:问题描述:Python 的 sys.path 从哪里初始化?UPD:Python 在引用 PYTHONPATH 之前添加了一些路径: >>> import sys >>> from pprint import pprint as p >>&...

问题描述:

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_prefixsys.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 = truepyvenv.cfghome = <DIRECTORY>sys.prefix`sys.executable

接下来,PYTHONHOME检查环境变量。在 Linux 和 Mac 上,
sys.prefixsys.exec_prefix被设置为PYTHONHOME环境变量(如果存在),取代中的任何home = <DIRECTORY>设置pyvenv.cfg。在 Windows 上,
sys.prefixsys.exec_prefix被设置为PYTHONHOME环境变量(如果存在),除非home = <DIRECTORY>中存在设置,否则pyvenv.cfg将改用该设置。

否则,从 的位置或给出的目录(如果有)向后走找到这些sys.prefix和。sys.exec_prefix`sys.executablehomepyvenv.cfg`

如果在目录或其任何父目录中找到该文件,则在 Linux 或 Mac 上
lib/python<version>/dyn-load将该目录设置为
。如果在目录或其任何子目录中找到该文件,则在 Linux、Mac 和 Windows 上将该目录设置为,并将设置为与Windows 上
相同的值
。如果设置了,则在 Windows 上将跳过整个步骤。要么使用目录,要么如果在中设置了,则改为使用目录作为初始值。sys.exec_prefix`lib/python<version>/os.pysys.prefixsys.exec_prefixsys.prefixapplocal = truesys.executablehomepyvenv.cfgsys.prefix`

如果找不到这些“地标”文件或sys.prefix尚未找到,则 python 会将其设置为“后备”值。例如,Linux 和 Mac 使用预编译的默认值作为和 的sys.prefix值。Windows 会等到完全确定后再为 设定后备值
sys.prefix`sys.exec_prefixsys.pathsys.prefix`

然后,(你们一直在等待的)python 确定要包含在中的初始值sys.path

  1. 将 python 正在执行的脚本的目录添加到sys.path。在 Windows 上,这始终是空字符串,它告诉 python 使用脚本所在的完整路径。

  2. 如果设置了 PYTHONPATH 环境变量的内容,则会将其添加到sys.path除非您使用的是 Windows 并applocal在 中将其设置为 true pyvenv.cfg

  3. <prefix>/lib/python35.zip在 Linux/Mac 和
    Windows 上的zip 文件路径os.path.join(os.dirname(sys.executable), "python.zip")被添加到sys.path

  4. 如果在 Windows 上,且applocal = true中未设置,则将添加pyvenv.cfg注册表项的子项的内容
    (如果有)。HK_CURRENT_USERSoftwarePythonPythonCore<DLLVersion>PythonPath

  5. 如果在 Windows 上,且applocal = true在中未设置pyvenv.cfg,且sys.prefix找不到,则添加注册表项的核心内容(如果存在);HK_CURRENT_USERSoftwarePythonPythonCore<DLLVersion>PythonPath

  6. 如果在 Windows 上,且applocal = true中未设置,则将添加pyvenv.cfg注册表项的子项的内容
    (如果有)。HK_LOCAL_MACHINESoftwarePythonPythonCore<DLLVersion>PythonPath

  7. 如果在 Windows 上,且applocal = true在中未设置pyvenv.cfg,且sys.prefix找不到,则添加注册表项的核心内容(如果存在);HK_CURRENT_USERSoftwarePythonPythonCore<DLLVersion>PythonPath

  8. 如果在 Windows 上,未设置 PYTHONPATH,未找到前缀,并且不存在注册表项,则会添加 PYTHONPATH 的相对编译时值;否则,将忽略此步骤。

  9. 编译时宏 PYTHONPATH 中的路径是相对于动态找到的路径添加的sys.prefix

  10. 在 Mac 和 Linux 上,会添加 的值sys.exec_prefix。在 Windows 上,会添加用于(或将用于)动态搜索的目录sys.prefix

此时,在 Windows 上,如果未找到前缀,则 Python 将尝试通过搜索中的所有目录来查找sys.path地标文件,就像它之前尝试对 的目录所做的那样sys.executable,直到找到某个文件为止。如果没有找到,sys.prefix则保留为空白。

最后,完成所有这些后,Python 会加载site模块,该模块会进一步添加内容sys.path

它首先从头部分和尾部分构建最多四个目录。对于头部分,它使用sys.prefixsys.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 初始化,加上安装相关的默认值”

-- http://docs.python.org/library/sys.html#sys.path

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2560  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1552  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   1  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   2  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   3  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用