什么build立与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中/python
  • PATH从PYTHONPATH环境variables。

而且我可以使用代码添加更多的path

 sys.path.insert(0, MORE_PATH) 
  • 什么样的程序设置了这些path,什么时候?
  • 有些path是用python源代码构build的吗?
  • 是否有可能用'sys.path.insert'插入的path被忽略? 我很好奇这个,就像mod_wsgi一样,我发现path没有find'sys.path.insert'。 我问这个问题的另一个职位 。

添加

基于迈克尔的回答,我看着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(/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6为我的Mac)的目录名应该内置到Python源代码。

大多数东西都是在Python的site.py设置的,在启动解释器的时候会自动导入(除非你用-S选项来启动它)。 在初始化期间,在解释器本身中几乎没有path(你可以通过用-S启动python来find它)。

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

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

学习Python

sys.path是模块searchpath。 Python在程序启动时对它进行configuration,自动合并顶层文件的主目录(或指定当前工作目录的空string),任何PYTHONPATH目录,创build的任何.pth文件path的内容以及标准库目录。 结果是Python在每次导入新文件时search的目录名称string列表。

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) 

path有这些部分:

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

path不被忽略。 但是,它们可能找不到,也不会引起错误。 sys.path只能被添加,不能从中减去。 Django不会删除path。

添加到接受的答案,并解决说,模块不应该从sys.path删除条目的意见:

这大致是真实的,但是在某些情况下,您可能希望通过删除条目来修改sys.path 。 例如 – 这是Mac特定的; * nix / Windows的推论可能存在 – 如果你创build一个自定义的Python.framework包含在你自己的项目中,你可能想忽略指向系统Python.framework的默认sys.path条目。

你有几个select:

  1. 像@damirv指出的那样,攻击site.py ,或者

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

    在这些path操作之后,将尝试导入一个名为sitecustomize的模块,该模块可以执行任意其他站点特定的自定义。 如果此导入失败并导致ImportErrorexception,则会被忽略。

另请注意:如果设置了PYTHONHOME env var,那么标准库将从此path加载,而不是默认的,如文档所述 。

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

你正在使用系统python /usr/bin/python

sys.path在python启动时从系统文件中设置。

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

不过,你可以在Python中更改sys.path,特别是在启动时:

在〜/ .bashrc或〜/ .zshrc中:

export PYTHONSTARTUP=~/.pythonrc

在〜/ .pythonrc中:

把你的改变写入sys.path。

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

对于系统的小风险,安装你自己的和更新的Python版本。