Python中sys.path的设置及时机是什么?

86 投票
7 回答
81409 浏览
提问于 2025-04-16 07:34

当我在我的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 在每次导入新文件时都会在这些目录中查找。

34

大部分的设置是在Python的 site.py 文件里,这个文件在你启动解释器的时候会自动加载(除非你用 -S 这个选项启动)。在初始化的时候,解释器本身也会设置一些路径(你可以通过用 -S 启动Python来查看具体是哪些)。

另外,一些框架(比如我记得是Django)在启动时会修改 sys.path 来满足它们的需求。

这个 site 模块有很不错的 文档,还有一份带注释的 源代码,如果你用 python -m site 来运行它,还会打印出一些信息。

撰写回答