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

2025-01-10 08:47:00
admin
原创
101
摘要:问题描述: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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用