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