Что настраивает sys.путь с питоном, и когда?


Когда я бегу

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 категорий.

  • / библиотека / Python / 2.6 / site-packages/*.яйцо
  • / библиотека / Python / 2.6 / site-packages
  • Фреймворки / Python.framework / Versions / 2.6 / lib / python2.6
  • Фреймворки / Python.фреймворк / версии / 2.6 / Экстра / lib / python
  • путь от переменной окружения PYTHONPATH.

И я могу добавить: дополнительные пути, использующие код

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

Добавлено

Основываясь на ответе Майкла, я заглянул в 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 / Framework / Python.framework / Versions / 2.6 / lib/python2. 6 для моего Mac) должен быть встроен в исходный код Python.

7 55

7 ответов:

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

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

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

Из Изучение Python:

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

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)

Путь состоит из следующих частей:

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

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

Добавление к принятому ответу и обращение к комментариям, которые говорят, что модуль не должен удалять записи из 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 исключение, оно молчаливо игнорируется.

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

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

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

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

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

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

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

export PYTHONSTARTUP=~/.pythonrc

В ~/.pythonrc:

Запишите свои изменения в sys.путь.

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

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