Что настраивает сис.путь в 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 / Versions/2.6/lib / python2.6
- Фреймворки / Python.framework / Versions/2.6/Extras/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который автоматически импортируется при запуске интерпретатора (если вы не запустите его с помощью ). Несколько путей настраиваются в самом интерпретаторе во время инициализации (вы можете узнать, какой из них, запустив python с-S).кроме того, некоторые фреймворки (например, Django я думаю) изменить
sys.pathпри запуске, чтобы удовлетворить их требования.The
siteмодуль имеет довольно хорошие документация, в комментарии исходный код и выводит некоторую информацию, если вы запустите его черезpython -m site.
с Изучаем Python:
sys.путь-это путь поиска модуля. Python настраивает его в программе запуск, автоматическое слияние домашний каталог файла верхнего уровня (или пустая строка для обозначения текущий рабочий каталог), любой Каталоги PYTHONPATH, содержимое любого .пт пути к файлам у вас есть создана и стандартная библиотека справочники. В результате получается список имя каталога строки, которые Python поиск по каждому импорту нового файла.
site.py это действительно ответы. Я хотел удалить все зависимости от старого Python, который установлен по умолчанию на моем mac. Это работает довольно хорошо, как 'site.py' вызывается каждый раз при запуске интерпретатора python.
для Mac я вручную добавил следующую строку в конце main() in /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.path:это в целом верно, но есть are обстоятельства, в которых вы можете захотеть изменить
sys.pathудаление программы. Например - и это зависит от Mac; * могут существовать следствия nix / Windows-Если вы создадите настраиваемыйPython.frameworkдля включения в свой собственный проект, который вы можете игнорировать значение по умолчаниюsys.pathзаписи, которые указывают на системуPython.framework.у вас есть несколько вариантов:
взломать
site.py, как указывает @damirv, илиДобавить свой собственный
sitecustomizeмодуль (или пакет) к пользовательской структуре, которая достигает того же конечного результата. Как указано вsite.pyкомментарии (для 2.7.6, во всяком случае):после этих манипуляций с путями делается попытка импортировать модуль именованный sitecustomize, который может выполнять произвольные дополнительные функции настройки для конкретного сайта. Если этот импорт не удается с помощью Исключение ImportError, оно молча игнорируется.
обратите внимание: если
PYTHONHOMEenv var установлен, стандартные библиотеки будут загружены с этого пути вместо стандартного, как документирована.Это не прямой ответ на вопрос, но что-то я только что обнаружил, что вызывает загрузку неправильных стандартных библиотек, и мои поиски приводят меня сюда по пути.
вы используете систему python
/usr/bin/python.sys.путь устанавливается из системных файлов при запуске python.
Не трогайте эти файлы, в частности site.py, потому что это может нарушить систему.
тем не менее, вы можете изменить sys.путь в Python, в частности, при запуске :
in ~/.bashrc или ~/.zshrc:
export PYTHONSTARTUP=~/.pythonrcin ~/.pythonrc:
записать изменения в sys.путь.
эти изменения будет только для вас в интерактивную оболочку.
для взлома с небольшим риском для системы, установите собственную и более позднюю версию python.
Comments