Что настраивает sys.path с Python и когда? - PullRequest
61 голосов
/ 24 ноября 2010

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

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-пакеты / *. egg
  • / Библиотека / Python / 2.6 / site-packages
  • Каркасы/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исходный код.

Ответы [ 7 ]

24 голосов
/ 25 ноября 2010

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

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

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

12 голосов
/ 25 ноября 2010

С Learning Python :

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

6 голосов
/ 10 октября 2011

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 голосов
/ 25 ноября 2010

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

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

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

1 голос
/ 01 июля 2017

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

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

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

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

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

export PYTHONSTARTUP=~/.pythonrc

в ~ / .pythonrc:

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

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

Чтобы взломать систему с небольшим риском, установите собственную и более позднюю версию Python.

1 голос
/ 29 июля 2016

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

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

1 голос
/ 03 марта 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...