Что устанавливает 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/*. Яйцо
  • /Library/Python/2.6/site-packages
  • Каркасы/Python.framework/Версии/2.6/Library/python2.6
  • Каркасы/Python.framework/Версии/2.6/Дополнительно/Library/Python
  • PATH из переменной среды PYTHONPATH.

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

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

ADDED

Основываясь на ответе Майкла, я просмотрел 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.

Ответ 1

Большая часть материала настраивается в Python site.py, который автоматически импортируется при запуске интерпретатора (если вы не запустите его с помощью опции -S). В процессе инициализации в самом интерпретаторе настраивается несколько путей (вы можете узнать, с чего начать с python с помощью -S).

Кроме того, некоторые фреймворки (например, Django, я думаю) изменяют sys.path при запуске, чтобы соответствовать их требованиям.

Модуль site имеет довольно хорошую документацию, прокомментировал исходный код и выводит некоторую информацию, если вы запустите его через python -m site.

Ответ 2

От обучения Python:

sys.path - это путь поиска модуля. Python настраивает его на программу запуск, автоматическое слияние домашний каталог файла верхнего уровня (или пустую строку для обозначения текущий рабочий каталог), любой Каталоги PYTHONPATH, содержание любых путей .pth файлов, которые вы и стандартная библиотека каталоги. Результатом является список строки каталога, которые Python поиск по каждому импорту нового файла.

Ответ 3

site.py действительно ответы. Я хотел удалить любые зависимости от старого Python, установленного по умолчанию на моем mac. Это работает очень хорошо, так как "site.py" вызывается каждый раз, когда запущен интерпретатор python.

Для Mac я вручную добавил следующую строку в конце main() в /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/site.py:

    sys.path =  filter (lambda a: not a.startswith('/System'), sys.path)

Ответ 4

Путь имеет следующие части:

  • Пути ОС, имеющие ваши системные библиотеки
  • текущий каталог python запущен с
  • переменная окружения $PYTHONPATH
  • вы можете добавлять пути во время выполнения.

Пути не игнорируются. Но они не могут быть найдены, и это не вызовет ошибки. sys.path следует добавлять только, а не вычитать. Django не удалял пути.

Ответ 5

Добавление к принятому ответу и обращение к комментариям, в которых говорится, что модуль не должен удалять записи из sys.path:

Это в целом верно, но есть обстоятельства, при которых вы можете изменить sys.path, удалив записи. Например - и это специфично для Mac; * nix/Windows могут возникнуть - если вы создадите настраиваемый Python.framework для включения в свой собственный проект, вы можете проигнорировать записи по умолчанию sys.path, которые указывают на систему Python.framework.

У вас есть несколько вариантов:

  • Взломайте site.py, как указывает @damirv, или

  • Добавьте собственный модуль sitecustomize (или пакет) в пользовательскую инфраструктуру, которая достигает одного и того же конечного результата. Как указано в комментариях site.py (для 2.7.6, во всяком случае):

    После этих манипуляций с путями делается попытка импортировать модуль named sitecustomize, который может выполнять произвольные дополнительные специфичные для сайта настройки. Если этот импорт не выполняется с Исключение ImportError, оно молча игнорируется.

Ответ 6

Также обратите внимание: если установлен PYTHONHOME env var, стандартные библиотеки будут загружаться из этого пути, а не по умолчанию, поскольку документально.

Это не прямой ответ на вопрос, но что-то, что я только что обнаружил, которое вызывало загрузку неправильных стандартных библиотек, и мои поиски привели меня сюда по пути.

Ответ 7

Вы используете системный python /usr/bin/python.

sys.path устанавливается из системных файлов при запуске python.

Не трогайте эти файлы, в частности site.py, потому что это может нарушить работу системы.

Однако вы можете изменить sys.path внутри python, в частности, при запуске:

в ~/.bashrc или ~/.zshrc:

export PYTHONSTARTUP=~/.pythonrc

в ~/.pythonrc:

напишите свои изменения на sys.path.

Эти изменения будут доступны только для вас в интерактивных оболочках.

Для взлома с небольшим риском для системы установите свою собственную и более новую версию python.