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 >>&...

问题描述:

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

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   984  
  在项目管理领域,CDCP(Certified Data Center Professional)认证评审是一个至关重要的环节,它不仅验证了项目团队的专业能力,还直接关系到项目的成功与否。在这一评审过程中,沟通技巧的运用至关重要。有效的沟通不仅能够确保信息的准确传递,还能增强团队协作,提升评审效率。本文将深入探讨CDCP...
华为IPD流程   0  
  IPD(Integrated Product Development,集成产品开发)是一种以客户需求为核心、跨部门协同的产品开发模式,旨在通过高效的资源整合和流程优化,提升产品开发的成功率和市场竞争力。在IPD培训课程中,掌握关键成功因素是确保团队能够有效实施这一模式的核心。以下将从五个关键成功因素展开讨论,帮助企业和...
IPD项目流程图   0  
  华为IPD(Integrated Product Development,集成产品开发)流程是华为公司在其全球化进程中逐步构建和完善的一套高效产品开发管理体系。这一流程不仅帮助华为在技术创新和产品交付上实现了质的飞跃,还为其在全球市场中赢得了显著的竞争优势。IPD的核心在于通过跨部门协作、阶段性评审和市场需求驱动,确保...
华为IPD   0  
  华为作为全球领先的通信技术解决方案提供商,其成功的背后离不开一套成熟的管理体系——集成产品开发(IPD)。IPD不仅是一种产品开发流程,更是一种系统化的管理思想,它通过跨职能团队的协作、阶段评审机制和市场需求驱动的开发模式,帮助华为在全球市场中脱颖而出。从最初的国内市场到如今的全球化布局,华为的IPD体系在多个领域展现...
IPD管理流程   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用