Python действительно очень старается грамотно настроить sys.path
. Как это установить, может быть очень сложно . Следующее руководством является разбавленным, несколькими-неполным, несколько-так, но , надеюсь, полезное руководством для неприметного питона программиста , что происходит , когда питон выясняет , что использовать в качестве начальных значений из sys.path
,
sys.executable
, sys.exec_prefix
, и sys.prefix
на обычной
установке python.
Во-первых, python делает все возможное, чтобы определить свое фактическое физическое местоположение в файловой системе на основе того, что ему сообщает операционная система. Если ОС просто говорит, что «python» запущен, он оказывается в $ PATH. Он разрешает любые символические ссылки. Как только он это сделает, путь к исполняемому файлу, который он найдет, будет использоваться в качестве значения sys.executable
, без «если», «и» или «но».
Затем он определяет начальные значения для sys.exec_prefix
и
sys.prefix
.
Если есть файл, который вызывается pyvenv.cfg
в том же каталоге
sys.executable
или на один каталог выше, python просматривает его. Разные операционные системы делают с этим файлом разные вещи.
Одно из значений в этом файле конфигурации, которое ищет 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
.
- Если в Windows и
applocal = true
было установлено no pyvenv.cfg
, то HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
добавляется содержимое подразделов раздела реестра
, если таковые имеются.
- Если в Windows
applocal = true
было задано no pyvenv.cfg
и sys.prefix
его не удалось найти, то добавляется основное содержимое раздела реестра HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
, если оно существует;
- Если в Windows и
applocal = true
было установлено no pyvenv.cfg
, то HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
добавляется содержимое подразделов раздела реестра
, если таковые имеются.
- Если в Windows
applocal = true
было задано no 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, а также проверяет вновь добавленный путь для файлов конфигурации.