问题: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之前的那些路径来自哪里?
回答 0
“从环境变量PYTHONPATH初始化,加上与安装有关的默认值”
回答 1
Python确实努力进行智能设置sys.path
,
sys.executable
,sys.exec_prefix
,和sys.prefix
在正常的
python安装上。
首先,python会尽最大努力根据操作系统告诉它在文件系统上的实际物理位置。如果操作系统只是说“ python”正在运行,它将在$ PATH中找到自己。它解析任何符号链接。完成此操作后,它将找到的可执行文件的路径用作sys.executable
,no ifs,ands或buts的值。
接下来,确定用于初始值sys.exec_prefix
和
sys.prefix
。
如果pyvenv.cfg
在与该目录相同的目录中有一个文件,
sys.executable
或者在一个目录中,则python会查看该文件。不同的操作系统对此文件执行不同的操作。
python在此配置文件中查找的值之一是configuration选项home = <DIRECTORY>
。sys.executable
当它动态设置以后的初始值时,Python将使用此目录而不是包含的目录sys.prefix
。如果该applocal = true
设置出现在pyvenv.cfg
Windows 的
文件中,但没有出现在home = <DIRECTORY>
设置中,sys.prefix
则将被设置为包含的目录sys.executable
。
接下来,PYTHONHOME
检查环境变量。在Linux和Mac上,
sys.prefix
并sys.exec_prefix
设置为PYTHONHOME
环境变量,如果它存在,并取代任何home = <DIRECTORY>
的设置pyvenv.cfg
。在Windows上,
sys.prefix
并且sys.exec_prefix
设置为PYTHONHOME
环境变量(如果存在),除非在中存在home = <DIRECTORY>
设置,否则将使用该设置pyvenv.cfg
。
否则,可以通过从或指定的目录(如果有)的位置向后走来找到sys.prefix
和。sys.exec_prefix
sys.executable
home
pyvenv.cfg
如果lib/python<version>/dyn-load
在该目录或其任何父目录中找到该文件,则将该目录设置为
sys.exec_prefix
在Linux或Mac上。如果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.prefix
和sys.exec_prefix
。Windows等到sys.path
完全确定要为设置后备值
为止sys.prefix
。
然后,(您一直在等待)python确定要包含在中的初始值sys.path
。
- python正在执行的脚本目录被添加到
sys.path
。在Windows上,这始终是空字符串,它告诉python使用脚本所在的完整路径。 - 除非您在Windows上并且在中设置为true
sys.path
,否则将添加PYTHONPATH环境变量的内容(如果applocal
已设置)pyvenv.cfg
。 <prefix>/lib/python35.zip
Linux / Mac和os.path.join(os.dirname(sys.executable), "python.zip")
Windows 上 的zip文件路径已添加到中sys.path
。- 如果在Windows上没有
applocal = true
在中设置Nopyvenv.cfg
,则HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
添加注册表项的子项的内容( 如果有)。 - 如果在Windows上未
applocal = true
在中设置Nopyvenv.cfg
,并且sys.prefix
找不到,则添加注册表项的核心内容(HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
如果存在); - 如果在Windows上没有
applocal = true
在中设置Nopyvenv.cfg
,则HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
添加注册表项的子项的内容( 如果有)。 - 如果在Windows上未
applocal = true
在中设置Nopyvenv.cfg
,并且sys.prefix
找不到,则添加注册表项的核心内容(HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
如果存在); - 如果在Windows上并且未设置PYTHONPATH,则找不到前缀,并且不存在注册表项,则添加PYTHONPATH的相对编译时值;否则,将忽略此步骤。
- 相对于dynamic-found添加了编译时宏PYTHONPATH中的路径
sys.prefix
。 - 在Mac和Linux上,将
sys.exec_prefix
添加的值。在Windows上,添加了用于(或将要使用)动态搜索的目录sys.prefix
。
在Windows的现阶段,如果未找到前缀,则python将尝试通过搜索所有目录中sys.path
的地标文件来确定它,就像它尝试使用sys.executable
以前的目录一样,直到找到了东西。如果不是,sys.prefix
则留空。
最后,在完成所有这些之后,Python加载了site
模块,这进一步为sys.path
以下模块添加了一些内容:
它从头和尾部分开始最多构建四个目录。头部使用
sys.prefix
和sys.exec_prefix
; 空头被跳过。对于尾部,它使用空字符串,然后lib/site-packages
(在Windows上)或lib/pythonX.Y/site-packages
(然后lib/site-python
在Unix和Macintosh上)使用。对于每个不同的首尾组合,它会查看它是否指向现有目录,如果是,则将其添加到sys.path中,并检查新添加的配置文件路径。