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 :(得分:56)
Python真的很努力地智能地设置sys.path
。怎么样
设置可以获得really complicated。以下指南是淡化的,
有点不完整,有点错误,但希望有用的指南
对于python时发生的事情的排名和文件python程序员
找出要用作sys.path
的初始值的内容,
正常上的sys.executable
,sys.exec_prefix
和sys.prefix
python安装。
首先,python最好地确定它的实际物理层次
文件系统上的位置,基于操作系统所说的内容
它。如果操作系统只是说" python"正在运行,它发现自己在$ PATH。
它解决了任何符号链接。一旦它完成了这个,路径
它找到的可执行文件用作sys.executable
的值,没有ifs,
ands,或buts。
接下来,它确定sys.exec_prefix
和的初始值
sys.prefix
。
如果在同一目录中有一个名为pyvenv.cfg
的文件
sys.executable
或一个目录,python查看它。不同
操作系统对此文件执行不同的操作。
此配置文件中python查找的值之一是
配置选项home = <DIRECTORY>
。 Python将使用此目录而不是包含sys.executable
的目录
当它稍后动态设置sys.prefix
的初始值时。如果applocal = true
设置出现在
Windows上的pyvenv.cfg
文件,但不是home = <DIRECTORY>
设置,
然后sys.prefix
将设置为包含sys.executable
的目录。
接下来,检查PYTHONHOME
环境变量。在Linux和Mac上,
sys.prefix
和sys.exec_prefix
设置为PYTHONHOME
环境变量if
它存在,取代 home = <DIRECTORY>
中的任何pyvenv.cfg
设置。在Windows上,
sys.prefix
和sys.exec_prefix
设置为PYTHONHOME
环境变量,
如果存在,除非<{em} home = <DIRECTORY>
设置pyvenv.cfg
,
而是使用它。
否则,通过向后走,可以找到这些sys.prefix
和sys.exec_prefix
来自sys.executable
的位置,或home
给出的pyvenv.cfg
目录(如果有的话)。
如果在该目录中找到文件lib/python<version>/dyn-load
或其任何父目录,该目录设置为
Linux或Mac上的sys.exec_prefix
。如果是文件
lib/python<version>/os.py
位于目录或其任何目录中
子目录,该目录在Linux上设置为sys.prefix
,
Mac和Windows,sys.exec_prefix
设置为相同的值
Windows上的sys.prefix
。如果是,则在Windows上跳过整个步骤
applocal = true
已设置。 sys.executable
的目录是
如果在home
中设置了pyvenv.cfg
,则使用或代替
sys.prefix
的初始值。
如果找不到这些&#34;具有里程碑意义的&#34;文件或sys.prefix
还没有
发现,然后python将sys.prefix
设置为&#34;后退&#34;
值。例如,Linux和Mac使用预编译的默认值作为
sys.prefix
和sys.exec_prefix
的值。 Windows等待
直到sys.path
被完全弄清楚才能为其设置回退值
sys.prefix
。
然后,(你们一直在等待什么,)python确定初始值
这些将包含在sys.path
。
sys.path
。
在Windows上,这始终是空字符串,它告诉python
使用脚本所在的完整路径。sys.path
,,除非您
在Windows上,applocal
中的pyvenv.cfg
设置为true。<prefix>/lib/python35.zip
Windows上的os.path.join(os.dirname(sys.executable), "python.zip")
已添加到sys.path
。applocal = true
中未设置pyvenv.cfg
,则表示注册表项的子项内容
如果有的话,会添加HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
。applocal = true
中未设置pyvenv.cfg
,则无法找到sys.prefix
,
然后添加注册表项HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
的核心内容(如果存在); applocal = true
中未设置pyvenv.cfg
,则表示注册表项的子项内容
如果有的话,会添加HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
。applocal = true
中未设置pyvenv.cfg
,则无法找到sys.prefix
,
然后添加注册表项HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
的核心内容(如果存在); sys.prefix
添加。sys.exec_prefix
的值。在Windows上,该目录
使用(或将被使用)动态搜索sys.prefix
的是
加入。在Windows的这个阶段,如果没有找到前缀,那么python将尝试
通过在sys.path
中搜索所有目录中的地标文件来确定它,
因为它之前尝试使用sys.executable
目录,直到找到了什么。
如果没有,则sys.prefix
会留空。
最后,在所有这些之后,Python加载了site
模块,它进一步增加了sys.path
的内容:
首先从头部和a构建最多四个目录 尾部。对于头部,它使用
sys.prefix
和sys.exec_prefix
; 空头被跳过了。对于尾部,它使用空字符串 然后lib/site-packages
(在Windows上)或lib/pythonX.Y/site-packages
然后lib/site-python
(在Unix和Macintosh上)。对于每一个 不同的头尾组合,它看是否指的是现有的 目录,如果是这样,将其添加到sys.path并检查新的 添加了配置文件的路径。
答案 1 :(得分:44)
“从环境变量PYTHONPATH初始化,加上依赖于安装的默认值”