Python的sys.path在哪里初始化?

时间:2009-05-22 13:19:06

标签: python path sys

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:\testdir

我想知道PYTHONPATH之前的那些路径来自哪里?

2 个答案:

答案 0 :(得分:56)

Python真的很努力地智能地设置sys.path。怎么样 设置可以获得really complicated。以下指南是淡化的, 有点不完整,有点错误,但希望有用的指南 对于python时发生的事情的排名和文件python程序员 找出要用作sys.path初始值的内容, 正常上的sys.executablesys.exec_prefixsys.prefix python安装。

首先,python最好地确定它的实际物理层次 文件系统上的位置,基于操作系统所说的内容 它。如果操作系统只是说" python"正在运行,它发现自己在$ PATH。 它解决了任何符号链接。一旦它完成了这个,路径 它找到的可执行文件用作sys.executable的值,没有ifs, ands,或buts。

接下来,它确定sys.exec_prefix和的初始值  sys.prefix

如果在同一目录中有一个名为pyvenv.cfg的文件 sys.executable或一个目录,python查看它。不同 操作系统对此文件执行不同的操作。

此配置文件中python查找的值之一是 配置选项home = <DIRECTORY>。 Python将使用此目录而不是包含sys.executable的目录 当它稍后动态设置sys.prefix的初始值时。如果applocal = true设置出现在 Windows上的pyvenv.cfg文件,但不是home = <DIRECTORY>设置, 然后sys.prefix将设置为包含sys.executable的目录。

接下来,检查PYTHONHOME环境变量。在Linux和Mac上, sys.prefixsys.exec_prefix设置为PYTHONHOME环境变量if 它存在,取代 home = <DIRECTORY>中的任何pyvenv.cfg设置。在Windows上, sys.prefixsys.exec_prefix设置为PYTHONHOME环境变量, 如果存在,除非<{em} home = <DIRECTORY>设置pyvenv.cfg, 而是使用它。

否则,通过向后走,可以找到这些sys.prefixsys.exec_prefix 来自sys.executable的位置,或home给出的pyvenv.cfg目录(如果有的话)。

如果在该目录中找到文件lib/python<version>/dyn-load 或其任何父目录,该目录设置为 Linux或Mac上的sys.exec_prefix。如果是文件 lib/python<version>/os.py位于目录或其任何目录中 子目录,该目录在Linux上设置为sys.prefix, Mac和Windows,sys.exec_prefix设置为相同的值 Windows上的sys.prefix。如果是,则在Windows上跳过整个步骤 applocal = true已设置。 sys.executable的目录是 如果在home中设置了pyvenv.cfg,则使用或代替 sys.prefix的初始值。

如果找不到这些&#34;具有里程碑意义的&#34;文件或sys.prefix还没有 发现,然后python将sys.prefix设置为&#34;后退&#34; 值。例如,Linux和Mac使用预编译的默认值作为 sys.prefixsys.exec_prefix的值。 Windows等待 直到sys.path被完全弄清楚才能为其设置回退值 sys.prefix

然后,(你们一直在等待什么,)python确定初始值 这些将包含在sys.path

  1. python正在执行的脚本的目录被添加到sys.path。 在Windows上,这始终是空字符串,它告诉python 使用脚本所在的完整路径。
  2. PYTHONPATH环境变量的内容(如果已设置)会添加到sys.path,除非您 在Windows上,applocal中的pyvenv.cfg设置为true。
  3. zip文件路径,在Linux / Mac和Linux上为<prefix>/lib/python35.zip Windows上的os.path.join(os.dirname(sys.executable), "python.zip")已添加到sys.path
  4. 如果在Windows上且applocal = true中未设置pyvenv.cfg,则表示注册表项的子项内容 如果有的话,会添加HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
  5. 如果在Windows上applocal = true中未设置pyvenv.cfg,则无法找到sys.prefix, 然后添加注册表项HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\核心内容(如果存在);
  6. 如果在Windows上且applocal = true中未设置pyvenv.cfg,则表示注册表项的子项内容 如果有的话,会添加HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
  7. 如果在Windows上applocal = true中未设置pyvenv.cfg,则无法找到sys.prefix, 然后添加注册表项HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\核心内容(如果存在);
  8. 如果在Windows上,并且未设置PYTHONPATH,则找不到前缀,并且没有存在注册表项,则 添加PYTHONPATH的相对编译时间值;否则,此步骤将被忽略。
  9. 编译时宏PYTHONPATH中的路径相对于动态找到的sys.prefix添加。
  10. 在Mac和Linux上,添加了sys.exec_prefix的值。在Windows上,该目录 使用(或将被使用)动态搜索sys.prefix的是 加入。
  11. 在Windows的这个阶段,如果没有找到前缀,那么python将尝试 通过在sys.path中搜索所有目录中的地标文件来确定它, 因为它之前尝试使用sys.executable目录,直到找到了什么。 如果没有,则sys.prefix会留空。

    最后,在所有这些之后,Python加载了site模块,它进一步增加了sys.path的内容:

      

    首先从头部和a构建最多四个目录   尾部。对于头部,它使用sys.prefixsys.exec_prefix;   空头被跳过了。对于尾部,它使用空字符串   然后lib/site-packages(在Windows上)或lib/pythonX.Y/site-packages   然后lib/site-python(在Unix和Macintosh上)。对于每一个   不同的头尾组合,它看是否指的是现有的   目录,如果是这样,将其添加到sys.path并检查新的   添加了配置文件的路径。

答案 1 :(得分:44)

“从环境变量PYTHONPATH初始化,加上依赖于安装的默认值”

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