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_prefixLinux или Mac. Если файл
lib/python<version>/os.pyнайден в каталоге или любом из его подкаталогов, этот каталог устанавливается в sys.prefixLinux, 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, а также проверяет вновь добавленный путь для файлов конфигурации.