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

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

UPD :Python在引用PYTHONPATH之前添加了一些path:

>>> 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之前的路线是从哪里来的?

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

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

Python真的很难智能地设置sys.path 。 它如何设置可以变得非常 复杂 。 下面的指南是一个贬低,有点不完整,有点不对,但有希望有用的指导,为sorting和文件的Python程序员,当python找出什么用作sys.path初始值sys.executablesys.exec_prefixsys.prefix在一个正常的 python安装。

首先,python根据操作系统告诉它的最佳级别来确定它在文件系统上的实际位置。 如果操作系统只是说“python”正在运行,它会发现自己在$ PATH。 它解决了任何符号链接。 一旦完成了它,它find的可执行文件的path将被用作sys.executable可执行文件的值,而不是ifs, sys.executable或buts。

接下来,它确定sys.exec_prefixsys.prefix的初始值。

如果在与pyvenv.cfg相同的目录或一个目录中有一个名为pyvenv.cfg的文件,python会查看它。 不同的操作系统对这个文件做了不同的事情。

python查找的这个configuration文件中的一个值是configuration选项home = <DIRECTORY> 。 Python将在sys.executabledynamic设置sys.prefix的初始值时使用此目录而不是包含sys.executable的目录。 如果pyvenv.cfg applocal = true设置出现在Windows的pyvenv.cfg文件中,但不是home = <DIRECTORY>设置,则sys.prefix将被设置为包含sys.executable的目录。

接下来,检查PYTHONHOME环境variables。 在Linux和Mac上,将sys.prefixsys.exec_prefix设置为PYTHONHOME环境variables(如果存在),则取代 pyvenv.cfg任何home = <DIRECTORY>设置。 在Windows上, sys.prefixPYTHONHOME存在home = <DIRECTORY>设置, 否则 sys.prefixsys.exec_prefix将设置为PYTHONHOME环境variables(如果存在)。

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

如果在该目录或其任何父目录中find文件lib/python<version>/dyn-load ,则该目录在Linux或Mac上设置为sys.exec_prefix 。 如果在目录或其任何子目录中find文件lib/python<version>/os.py ,那么在Linux,Mac和Windows上将该目录设置为sys.prefix ,并将sys.exec_prefix设置为相同值为sys.prefix在Windows上。 如果设置了applocal = true则在Windows上跳过整个步骤。 可以使用sys.executable的目录,或者,如果在pyvenv.cfg设置了pyvenv.cfg ,那么将使用sys.prefix的初始值。

如果找不到这些“地标”文件,或者还没有findsys.prefix ,那么python将sys.prefix设置为“fallback”值。 例如,Linux和Mac使用预先编译的默认值作为sys.prefixsys.exec_prefix的值。 Windows会一直等到sys.path完全解决,为sys.prefix设置一个回退值。

然后,(你一直在等待什么)python决定了sys.path包含的初始值。

  1. python正在执行的脚本的目录被添加到sys.path 。 在Windows上,这总是空string,它告诉python使用当前的工作目录。
  2. 如果设置了PYTHONPATH环境variables的内容,则会添加到sys.path除非您在Windows上,并且pyvenv.cfg中的pyvenv.cfg设置为true。
  3. 将在Linux / Mac上的<prefix>/lib/python35.zip<prefix>/lib/python35.zip上的os.path.join(os.dirname(sys.executable), "python.zip")的zip文件path添加到sys.path
  4. 如果在Windows上并且pyvenv.cfg没有设置pyvenv.cfg applocal = true ,则会添加registry项HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\的子项的内容(如果有的话)。
  5. 如果在Windows上并且没有在pyvenv.cfg中设置pyvenv.cfg applocal = true ,并且sys.prefix ,则添加registry项HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\核心内容如果存在的话;
  6. 如果在Windows上并且pyvenv.cfg没有设置pyvenv.cfg applocal = true ,则会添加registry项HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\的子项的内容(如果有的话)。
  7. 如果在Windows上并且没有在pyvenv.cfg中设置pyvenv.cfg applocal = true ,并且sys.prefix ,则添加registry项HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\核心内容如果存在的话;
  8. 如果在Windows上,并且没有设置PYTHONPATH,则找不到前缀,并且不存在任何registry项,则添加PYTHONPATH的相对编译时间值; 否则,这一步被忽略。
  9. 编译时macrosPYTHONPATH中的path相对于dynamicfind的sys.prefix被添加。
  10. 在Mac和Linux上,添加了sys.exec_prefix的值。 在Windows上,添加了用于(或将被使用)dynamicsearchsys.prefix

在Windows的这个阶段,如果没有find前缀,那么python会尝试通过searchsys.path中的所有目录来寻找地标文件,因为它试图先用sys.executable的目录,直到find一些东西。 如果没有, sys.prefix留空。

最后,在所有这些之后,Python加载了site模块,这个模块进一步添加了一些东西到sys.path

它从头部和尾部开始构build四个目录。 头部分使用sys.prefix和sys.exec_prefix; 空的头被跳过。 对于尾部,它使用空string,然后使用lib / site-packages(在Windows上)或lib / pythonX.Y / site-packages,然后使用lib / site-python(在Unix和Macintosh上)。 对于每个独特的头尾组合,它会查看它是否指向一个现有目录,如果是,则将其添加到sys.path中,并检查新添加的configuration文件的path。