用Python设置sys.path的时间是什么时候?

时间:2010-11-24 20:57:53

标签: python 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 / *。蛋
  • /Library/Python/2.6/site-packages
  • 框架/ Python.framework /版本/ 2.6 / LIB / python2.6的
  • 框架/ Python.framework /版本/ 2.6 /附加/ LIB /蟒
  • 来自PYTHONPATH环境变量的路径。

我可以使用代码添加更多路径

sys.path.insert(0, MORE_PATH)
  • 哪些例程设置这些路径,何时设置?
  • 有些路径是用python源代码构建的吗?
  • 是否可能忽略使用'sys.path.insert'插入的路径?我对此感到好奇,就像mod_wsgi一样,我发现'sys.path.insert'找不到路径。我问another post这个问题。

ADDED

根据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 个答案:

答案 0 :(得分:24)

大部分内容都是在Python site.py中设置的,在启动解释器时会自动导入(除非您使用-S选项启动它)。在初始化期间,解释器本身设置的路径很少(您可以通过使用-S启动python来找出哪些路径)。

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

site模块非常好documentation,评论为source code,如果您通过python -m site运行,则会打印出一些信息。

答案 1 :(得分:10)

来自学习Python

  

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

答案 2 :(得分:6)

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)

答案 3 :(得分:4)

路径包含以下部分:

  • 具有系统库的操作系统路径
  • 当前目录python从
  • 开始
  • 环境变量$PYTHONPATH
  • 您可以在运行时添加路径。

路径不会被忽略。但是,它们可能无法找到,也不会引发错误。 sys.path也应该只添加,而不是从中减去。 Django不会删除路径。

答案 4 :(得分:1)

添加到已接受的答案,并解决说明模块不应从sys.path中删除条目的注释:

这是大致正确的,但 的情况下,您可能希望通过删除条目来修改sys.path。例如 - 这是特定于Mac的; * nix / Windows推论可能存在 - 如果您创建自定义Python.framework以包含在您自己的项目中,您可能希望忽略指向系统sys.path的默认Python.framework条目。

您有几个选择:

  1. 哈希site.py,如@damirv所示,或

  2. 将您自己的sitecustomize模块(或包)添加到实现相同最终结果的自定义框架中。如site.py评论中所示(无论如何,为2.7.6):

      

    在这些路径操作之后,尝试导入模块   命名为sitecustomize,可以执行任意附加操作   特定于站点的自定义。如果导入失败并带有   ImportError异常,它被默默忽略。

答案 5 :(得分:1)

另请注意:如果设置了PYTHONHOME env var,则会从此路径而不是默认值documented加载标准库。

这不是这个问题的直接答案,但我刚刚发现的是导致错误的标准库被加载,我的搜索引导我一路走来。

答案 6 :(得分:1)

您使用的是系统python /usr/bin/python

sys.path是从python startup的系统文件设置的。

请勿触摸这些文件,特别是site.py,因为这可能会扰乱系统。

但是,您可以在python中更改sys.path,特别是在启动时:

在〜/ .bashrc或〜/ .zshrc:

export PYTHONSTARTUP=~/.pythonrc

在〜/ .pythonrc中:

将您的更改写入sys.path。

这些更改仅适用于交互式shell。

对于系统风险较小的黑客攻击,请安装自己的和更新的python版本。