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初始化,加上依赖于安装的默认值”
Python真的很难智能地设置sys.path
。 它如何设置可以变得非常 复杂 。 下面的指南是一个贬低,有点不完整,有点不对,但有希望有用的指导,为sorting和文件的Python程序员,当python找出什么用作sys.path
的初始值 , sys.executable
, sys.exec_prefix
和sys.prefix
在一个正常的 python安装。
首先,python根据操作系统告诉它的最佳级别来确定它在文件系统上的实际位置。 如果操作系统只是说“python”正在运行,它会发现自己在$ PATH。 它解决了任何符号链接。 一旦完成了它,它find的可执行文件的path将被用作sys.executable
可执行文件的值,而不是ifs, sys.executable
或buts。
接下来,它确定sys.exec_prefix
和sys.prefix
的初始值。
如果在与pyvenv.cfg
相同的目录或一个目录中有一个名为pyvenv.cfg
的文件,python会查看它。 不同的操作系统对这个文件做了不同的事情。
python查找的这个configuration文件中的一个值是configuration选项home = <DIRECTORY>
。 Python将在sys.executable
dynamic设置sys.prefix
的初始值时使用此目录而不是包含sys.executable
的目录。 如果pyvenv.cfg
applocal = true
设置出现在Windows的pyvenv.cfg
文件中,但不是home = <DIRECTORY>
设置,则sys.prefix
将被设置为包含sys.executable
的目录。
接下来,检查PYTHONHOME
环境variables。 在Linux和Mac上,将sys.prefix
和sys.exec_prefix
设置为PYTHONHOME
环境variables(如果存在),则取代 pyvenv.cfg
任何home = <DIRECTORY>
设置。 在Windows上, sys.prefix
在PYTHONHOME
存在home = <DIRECTORY>
设置, 否则 sys.prefix
和sys.exec_prefix
将设置为PYTHONHOME
环境variables(如果存在)。
否则,这些sys.prefix
和sys.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.prefix
和sys.exec_prefix
的值。 Windows会一直等到sys.path
完全解决,为sys.prefix
设置一个回退值。
然后,(你一直在等待什么)python决定了sys.path
包含的初始值。
- python正在执行的脚本的目录被添加到
sys.path
。 在Windows上,这总是空string,它告诉python使用当前的工作目录。 - 如果设置了PYTHONPATH环境variables的内容,则会添加到
sys.path
, 除非您在Windows上,并且pyvenv.cfg
中的pyvenv.cfg
设置为true。 - 将在Linux / Mac上的
<prefix>/lib/python35.zip
和<prefix>/lib/python35.zip
上的os.path.join(os.dirname(sys.executable), "python.zip")
的zip文件path添加到sys.path
。 - 如果在Windows上并且
pyvenv.cfg
没有设置pyvenv.cfg
applocal = true
,则会添加registry项HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
的子项的内容(如果有的话)。 - 如果在Windows上并且没有在
pyvenv.cfg
中设置pyvenv.cfg
applocal = true
,并且sys.prefix
,则添加registry项HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
的核心内容如果存在的话; - 如果在Windows上并且
pyvenv.cfg
没有设置pyvenv.cfg
applocal = true
,则会添加registry项HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
的子项的内容(如果有的话)。 - 如果在Windows上并且没有在
pyvenv.cfg
中设置pyvenv.cfg
applocal = true
,并且sys.prefix
,则添加registry项HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
的核心内容如果存在的话; - 如果在Windows上,并且没有设置PYTHONPATH,则找不到前缀,并且不存在任何registry项,则添加PYTHONPATH的相对编译时间值; 否则,这一步被忽略。
- 编译时macrosPYTHONPATH中的path相对于dynamicfind的
sys.prefix
被添加。 - 在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。