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

2025-01-10 08:47:00
admin
原创
127
摘要:问题描述: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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2379  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1510  
  PLM(产品生命周期管理)系统在企业项目管理中扮演着至关重要的角色,它能够整合产品从概念设计到退役的全流程信息,提升协同效率,降低成本。然而,项目范围蔓延是项目管理过程中常见且棘手的问题,在PLM系统环境下也不例外。范围蔓延可能导致项目进度延迟、成本超支、质量下降等一系列不良后果,严重影响项目的成功交付。因此,如何在P...
plm项目经理是做什么   16  
  PLM(产品生命周期管理)系统在现代企业的产品研发与管理过程中扮演着至关重要的角色。它不仅仅是一个管理产品数据的工具,更能在利益相关者分析以及沟通矩阵设计方面提供强大的支持。通过合理运用PLM系统,企业能够更好地识别、理解和管理与产品相关的各类利益相关者,构建高效的沟通机制,从而提升产品开发的效率与质量,增强企业的市场...
plm是什么   20  
  PLM(产品生命周期管理)项目管理对于企业产品的全生命周期规划、执行与监控至关重要。在项目推进过程中,监控进度偏差是确保项目按时、按质量完成的关键环节。五维健康检查指标体系为有效监控PLM项目进度偏差提供了全面且系统的方法,涵盖了项目的多个关键维度,有助于及时发现问题并采取针对性措施。需求维度:精准把握项目基石需求维度...
plm项目管理软件   18  
热门文章
项目管理软件有哪些?
曾咪二维码

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

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

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用