Что настраивает 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 ответов:
Большая часть материала настроена в 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
.У вас есть несколько вариантов:
Взломайте
site.py
, как указывает @damirv, илиДобавьте свой собственный модуль (или пакет)
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.