什么建立与Python的sys.path,什么时候?

当我跑步

import sys 
print sys.path

在我的Mac上(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
  • 框架/ Python.framework /版本/ 2.6 / lib中/ python2.6的
  • 框架/ Python.framework /版本/ 2.6 /额外/ lib中/蟒蛇
  • PATH来自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源代码中。


    大多数东西都是在Python的site.py设置的,它会在启动解释器时自动导入(除非用-S选项启动它)。 在初始化过程中,解释器本身设置的路径很少(你可以通过用-S启动python来找到它)。

    此外,一些框架(如我认为的Django)在启动时修改sys.path以满足其要求。

    site模块有一个非常好的文档,一个注释的源代码,并打印出一些信息,如果你通过python -m site运行它。


    从学习Python:

    sys.path是模块搜索路径。 Python在程序启动时对它进行配置,自动合并顶级文件的主目录(或指定当前工作目录的空字符串),任何PYTHONPATH目录,您创建的任何.pth文件路径的内容以及标准库目录。 结果是Python在每次导入新文件时搜索的目录名称字符串列表。


    site.py确实是答案。 我想删除我的mac上默认安装的旧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)
    
    链接地址: http://www.djcxy.com/p/9415.html

    上一篇: What sets up sys.path with Python, and when?

    下一篇: wsgi modify sys.path when it's running?