Python中sys.path的设置及时机是什么?
当我在我的Mac上运行
import sys
print sys.path
(我的系统是Mac OS X 10.6.5,使用的是Python 2.6.1),我得到了以下结果。
/Library/Python/2.6/site-packages/ply-3.3-py2.6.egg ... /Library/Python/2.6/site-packages/ipython-0.10.1-py2.6.egg /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python26.zip /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6 /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-darwin /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac/lib-scriptpackages /System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-tk /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-old /System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload /Library/Python/2.6/site-packages /System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC /System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/wx-2.8-mac-unicode
这些结果分成了5个类别。
- /Library/Python/2.6/site-packages/*.egg
- /Library/Python/2.6/site-packages
- Frameworks/Python.framework/Versions/2.6/lib/python2.6
- Frameworks/Python.framework/Versions/2.6/Extras/lib/python
- 来自PYTHONPATH环境变量的路径。
我还可以通过以下代码添加更多路径
sys.path.insert(0, MORE_PATH)
- 哪些程序设置了这些路径,是什么时候设置的?
- 这些路径中有一些是Python源代码里自带的吗?
- 用'sys.path.insert'插入的路径会被忽略吗?我对此很好奇,因为在使用mod_wsgi时,我发现用'sys.path.insert'插入的路径找不到。我在另一篇帖子中问了这个问题。
补充
根据Michael的回答,我查看了site.py,得到了以下代码。
def addsitepackages(known_paths):
"""Add site-packages (and possibly site-python) to sys.path"""
sitedirs = []
seen = []
for prefix in PREFIXES:
if not prefix or prefix in seen:
continue
seen.append(prefix)
if sys.platform in ('os2emx', 'riscos'):
sitedirs.append(os.path.join(prefix, "Lib", "site-packages"))
elif sys.platform == 'darwin' and prefix == sys.prefix:
sitedirs.append(os.path.join("/Library/Python", sys.version[:3], "site-packages"))
我还认为包含site.py的目录名(在我的Mac上是/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6)应该是Python源代码里自带的。
7 个回答
6
site.py确实是个好办法。我想要去掉我电脑上默认安装的旧版Python的任何依赖。这个方法效果不错,因为每次启动Python解释器时,都会调用'site.py'。
对于Mac,我手动在/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/site.py的main()函数末尾添加了以下这一行:
sys.path = filter (lambda a: not a.startswith('/System'), sys.path)
16
来自《学习Python》的内容:
sys.path 是一个模块搜索路径。 当你启动程序时,Python 会自动设置这个路径,它会把几个地方的目录合并在一起: 首先是你运行的主文件所在的目录(如果没有主文件,它会用一个空字符串来表示当前工作目录), 其次是你设置的任何 PYTHONPATH 目录, 然后是你创建的任何 .pth 文件中的路径, 最后还有标准库的目录。 最终,这些合并后的目录会形成一个字符串列表, Python 在每次导入新文件时都会在这些目录中查找。