Откуда инициализируется sys.path Python?
Вопрос
Откуда инициализируется sys.path Python?
УПД:Python добавляет несколько путей перед обращением к PYTHONPATH:
>>> import sys
>>> from pprint import pprint as p
>>> p(sys.path)
['',
'C:\\Python25\\lib\\site-packages\\setuptools-0.6c9-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\orbited-0.7.8-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\morbid-0.8.6.1-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\demjson-1.4-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\stomper-0.2.2-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\uuid-1.30-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\stompservice-0.1.0-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\cherrypy-3.0.1-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\pyorbited-0.2.2-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\flup-1.0.1-py2.5.egg',
'C:\\Python25\\lib\\site-packages\\wsgilog-0.1-py2.5.egg',
'c:\\testdir',
'C:\\Windows\\system32\\python25.zip',
'C:\\Python25\\DLLs',
'C:\\Python25\\lib',
'C:\\Python25\\lib\\plat-win',
'C:\\Python25\\lib\\lib-tk',
'C:\\Python25',
'C:\\Python25\\lib\\site-packages',
'C:\\Python25\\lib\\site-packages\\PIL',
'C:\\Python25\\lib\\site-packages\\win32',
'C:\\Python25\\lib\\site-packages\\win32\\lib',
'C:\\Python25\\lib\\site-packages\\Pythonwin']
Мой PYTHONPATH:
PYTHONPATH=c:\testdir
Интересно, откуда берутся эти пути перед PYTHONPATH?
Решение
«Инициализируется из переменной среды PYTHONPATH плюс значение по умолчанию, зависящее от установки»
Другие советы
Python действительно старается разумно установить sys.path
.Как это настроено, может получить Действительно сложный.Следующее руководство представляет собой размахиваемое, несколько неполное, несколько громкое, но, надеемся начальные значения из sys.path
,
sys.executable
, sys.exec_prefix
, и sys.prefix
на нормальныйустановка питона.
Во -первых, Python делает все возможное, чтобы выяснить свое фактическое физическое местоположение в файловой системе, основываясь на том, что говорит операционная система.Если ОС просто сообщает, что «python» запущен, она оказывается в $PATH.Он разрешает любые символические ссылки.Как только это сделает это, путь исполняемого, который он находит, используется в качестве значения для sys.executable
, нет IFS, и, или нот.
Далее он определяет начальные значения для sys.exec_prefix
и sys.prefix
.
Если существует файл с именем pyvenv.cfg
в том же каталоге, что иsys.executable
или на один каталог выше, Python просматривает его.Разные OSES делают разные вещи с этим файлом.
Одним из значений в этом файле конфигурации, которое ищет Python, является параметр конфигурации home = <DIRECTORY>
.Python будет использовать этот каталог вместо каталога, содержащего sys.executable
когда он динамически устанавливает начальное значение sys.prefix
позже.Если applocal = true
настройка появится вpyvenv.cfg
файл в Windows, но не home = <DIRECTORY>
настройка, тогда sys.prefix
будет установлен в каталог, содержащий sys.executable
.
Далее, PYTHONHOME
проверяется переменная среды.В Linux и Mac,sys.prefix
и sys.exec_prefix
установлены на PYTHONHOME
переменная среды, если она существует, заменяющий любой home = <DIRECTORY>
установка в pyvenv.cfg
.В Windows,sys.prefix
и sys.exec_prefix
установлен на PYTHONHOME
переменная среды, если она существует, пока не а home = <DIRECTORY>
настройка присутствует в pyvenv.cfg
, который используется вместо этого.
В противном случае эти sys.prefix
и sys.exec_prefix
найдены путем выхода назад из расположения sys.executable
, или home
каталог, заданный pyvenv.cfg
если таковые имеются.
Если файл lib/python<version>/dyn-load
обнаружен в этом каталоге или в любом из его родительских каталогов, что каталог должен бытьsys.exec_prefix
на Linux или Mac.Если файлlib/python<version>/os.py
находится в каталоге или в любой из его подкаталогов, что каталог установлен на sys.prefix
на Linux, Mac и Windows, с sys.exec_prefix
установить то же значение, что иsys.prefix
в Windows.Весь этот шаг пропускается в Windows, еслиapplocal = true
установлен.Либо каталог sys.executable
используется или, если home
установлен в pyvenv.cfg
, вместо этого используется для начального значения sys.prefix
.
Если он не может найти эти «ориентировочные» файлы или sys.prefix
еще не найден, затем наборы Python sys.prefix
к значению «отступления».Linux и Mac, например, используют предварительно скомпилированные значения по умолчанию в качестве значений sys.prefix
и sys.exec_prefix
.Windows ждет до sys.path
полностью проработано, чтобы установить резервное значение дляsys.prefix
.
Затем (чего вы все ждали) Python определяет начальные значения, которые должны быть содержится в sys.path
.
- Каталог скрипта, который выполняет Python, добавляется в
sys.path
.В Windows это всегда пустая строка, которая говорит Python использовать полный путь, где вместо этого находится скрипт. - Содержимое переменной среды PYTHONPATH, если она установлена, добавляется в
sys.path
, пока не Вы в Windows иapplocal
установлено значение true вpyvenv.cfg
. - Путь к zip-файлу, который
<prefix>/lib/python35.zip
на Linux/Mac иos.path.join(os.dirname(sys.executable), "python.zip")
в Windows добавляется вsys.path
. - Если на винде и нет
applocal = true
был установлен вpyvenv.cfg
, затем содержимое подразделов раздела реестраHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
добавляются, если таковые имеются. - Если на винде и нет
applocal = true
был установлен вpyvenv.cfg
, иsys.prefix
нельзя было найти, тогда основное содержание ключа реестраHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
добавляется, если он существует; - Если на винде и нет
applocal = true
был установлен вpyvenv.cfg
, затем содержимое подразделов раздела реестраHK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
добавляются, если таковые имеются. - Если на винде и нет
applocal = true
был установлен вpyvenv.cfg
, иsys.prefix
нельзя было найти, тогда основное содержание ключа реестраHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
добавляется, если он существует; - Если в Windows, а PythonPath не был установлен, префикс не был найден, и никаких ключей реестра не было, тогда добавляется относительное значение времени компиляции PythonPath;в противном случае этот шаг игнорируется.
- Пути в макросе PYTHONPATH времени компиляции добавляются относительно динамически найденных
sys.prefix
. - В Mac и Linux значение
sys.exec_prefix
добавлен.В Windows каталог, который использовался (или был использован) для динамического поиска дляsys.prefix
добавлен.
На этом этапе на Windows, если префикс не обнаружился, то Python попытается определить его, поиск все каталоги в sys.path
для знаковых файлов, как это пыталось сделать с каталогом sys.executable
ранее, пока он что-то не найдет.Если это не так, sys.prefix
остается пустым.
Наконец, после всего этого, Python загружает site
модуль, который добавляет еще больше вещей в sys.path
:
Он начинается с построения до четырех каталогов из головы и хвостовой части.Для головной части используется
sys.prefix
иsys.exec_prefix
;пустые главы пропускаются.Для хвостовой части он использует пустую строку, а затемlib/site-packages
(в Windows) илиlib/pythonX.Y/site-packages
а потомlib/site-python
(в Unix и Macintosh).Для каждой из различных комбинаций головного хвоста он видит, относится ли к существующему каталогу, и если да, добавляет его в Sys.path, а также осматривает недавно добавленный путь для файлов конфигурации.