2009-05-22 48 views
68

Python的sys.path从哪里初始化?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的那些那些路径从何而来?

回答

36

“从环境变量PYTHONPATH初始化,再加上安装相关的默认”

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

+5

我猜他们来自现场模块: http://docs.python.org/library/site.html – ashcatch 2009-05-22 14:10:44

+12

该网站模块加载并解析您的站点包的任何.pth文件的内容目录。这些.pth文件包含对PYTHONPATH的补充 – ASk 2009-05-22 21:03:21

29

Python的真正力图智能设置sys.path。 怎么设定可以得到reallycomplicated。下面的指南是一个打了折扣的, 有点不完全,有些-错,但希望-有用的指导 对发生了什么的职级和文件Python程序员时蟒蛇 计算出的初始值使用什么sys.path, sys.executable,sys.exec_prefixsys.prefix上一个正常 python安装。

首先,python根据操作系统告知 的情况,尽其最大努力找出文件系统上的实际物理位置 。如果操作系统只是说“python”正在运行,它会发现自己在$ PATH中。 它解决了任何符号链接。完成此操作后,它找到的可执行文件的路径 将用作sys.executable的值,否ifs, ands或buts。

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

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

Python配置文件中的一个值是 配置选项home = <DIRECTORY>。当它稍后动态设置初始值sys.prefix时,Python将使用该目录而不是包含sys.executable 的目录。如果applocal = true设置出现在Windows上的 pyvenv.cfg文件中,但不是home = <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.prefixsys.exec_prefix被从如有由pyvenv.cfg给出sys.executable的位置,或home目录倒着走 发现。

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

如果找不到这些“地标”文件或sys.prefix一直没有找到 还,那么Python套sys.prefix一个“回退” 值。例如,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设置为true在pyvenv.cfg
  3. 在Windows上,Linux/Mac上的<prefix>/lib/python35.zip和Windows上的 os.path.join(os.dirname(sys.executable), "python.zip")的zip文件路径被添加到sys.path
  4. 如果在Windows上并且在pyvenv.cfg中没有设置applocal = true,则会添加注册表项 HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\的子项的内容(如果有)。
  5. 如果在Windows上,没有applocal = truepyvenv.cfg设置,并且sys.prefix找不到, 那么核心内容的注册表项HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\添加,如果它存在的;
  6. 如果在Windows上并且在pyvenv.cfg中没有设置applocal = true,则会添加注册表项 HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\的子项的内容(如果有)。
  7. 如果在Windows上,没有applocal = truepyvenv.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的地址是 。

在这个阶段在Windows上,如果没有前缀被找到,那么Python会 通过具有里程碑意义的文件搜索所有目录中sys.path确定它, 因为它试图用的目录做以前,直到它找到一些东西。 如果不是,sys.prefix留空。

最后,这一切后,巨蟒加载site模块,它增加了东西又进一步sys.path

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