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

Where is Python's sys.path initialized from?

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    >>> 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是:

1
    PYTHONPATH=c:\testdir

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


Python真的很难智能地设置sys.path。怎么样
集可以变得非常复杂。以下指南是淡化的,
有点不完整,有点错误,但希望有用的指南
对于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 = 。 Python将使用此目录而不是包含sys.executable的目录
当它稍后动态设置sys.prefix的初始值时。如果applocal = true设置出现在
Windows上的pyvenv.cfg文件,但不是home = 设置,
然后将sys.prefix设置为包含sys.executable的目录。

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

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

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

如果找不到这些"里程碑"文件或sys.prefix尚未
发现,然后python将sys.prefix设置为"后备"
值。例如,Linux和Mac使用预编译的默认值作为
sys.prefixsys.exec_prefix。 Windows等待
直到sys.path被完全弄清楚才能设置回退值
sys.prefix

然后,(你们一直在等待的东西,)python确定初始值
将包含在sys.path中。

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

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

    It starts by constructing up to four directories from a head and a
    tail part. For the head part, it uses sys.prefix and sys.exec_prefix;
    empty heads are skipped. For the tail part, it uses the empty string
    and then lib/site-packages (on Windows) or lib/pythonX.Y/site-packages
    and then lib/site-python (on Unix and Macintosh). For each of the
    distinct head-tail combinations, it sees if it refers to an existing
    directory, and if so, adds it to sys.path and also inspects the newly
    added path for configuration files.

    Ok.

    好。


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

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