Что и когда устанавливает sys.path в Python?

Когда я запускаю

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
  • Frameworks/Python.framework/Versions/2.6/lib/python2.6
  • Frameworks/Python.framework/Versions/2.6/Extras/lib/python
  • PATH из переменной окружения PYTHONPATH.

И я могу добавить больше путей, используя код

sys.path.insert(0, MORE_PATH)
  • Какие процедуры устанавливают эти пути и когда?
  • Некоторые пути встроены в исходный код python?
  • Возможно ли, что пути, вставленные с помощью 'sys.path.insert', игнорируются? Мне это интересно, так как с mod_wsgi я обнаружил, что пути не находятся с помощью '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.

64
задан Community 23 May 2017 в 12:10
поделиться