Откуда инициализируется sys.path Python?

112

Откуда инициализируется sys.path Python?

UPD : 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?

Alex
источник

Ответы:

49

«Инициализировано из переменной среды PYTHONPATH, плюс значение по умолчанию, зависящее от установки»

- http://docs.python.org/library/sys.html#sys.path

DFA
источник
7
Я предполагаю, что они исходят из модуля сайта: docs.python.org/library/site.html
ashcatch
20
Модуль сайта загружает и анализирует содержимое любых файлов .pth в каталоге пакетов сайта. Эти файлы .pth содержат дополнение к вашему PYTHONPATH
ASK
77

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.

  1. Каталог скрипта, в котором выполняется python, добавляется sys.path. В Windows это всегда пустая строка, которая указывает python использовать вместо этого полный путь, по которому расположен скрипт.
  2. Содержимое переменной среды PYTHONPATH, если она задана, добавляется sys.path, если вы не работаете в Windows и applocalдля нее установлено значение true в pyvenv.cfg.
  3. Путь к zip-файлу, который находится <prefix>/lib/python35.zipв Linux / Mac и os.path.join(os.dirname(sys.executable), "python.zip")Windows, добавляется в sys.path.
  4. Если в Windows и applocal = trueбыло установлено no pyvenv.cfg, то HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\добавляется содержимое подразделов раздела реестра , если таковые имеются.
  5. Если в Windows applocal = trueбыло задано no pyvenv.cfgи sys.prefixего не удалось найти, то добавляется основное содержимое раздела реестра HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\, если оно существует;
  6. Если в Windows и applocal = trueбыло установлено no pyvenv.cfg, то HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\добавляется содержимое подразделов раздела реестра , если таковые имеются.
  7. Если в Windows applocal = trueбыло задано no pyvenv.cfgи sys.prefixего не удалось найти, то добавляется основное содержимое раздела реестра HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\, если оно существует;
  8. Если в Windows и PYTHONPATH не был установлен, префикс не был найден и ключи реестра не присутствовали, то добавляется относительное значение времени компиляции PYTHONPATH; в противном случае этот шаг игнорируется.
  9. Пути в макросе времени компиляции PYTHONPATH добавляются относительно динамически найденного sys.prefix.
  10. В 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, а также проверяет вновь добавленный путь для файлов конфигурации.

djhaskin987
источник
1
Несмотря на то, что написано в документации, это sys.executableможет быть символическая ссылка или что угодно, если она argv[0]содержит косые черты. Фактический путь к исполняемому файлу (от execv(path, argv)вызова) не используется.
jfs
1
Что касается вашего первого пункта для sys.pathWindows 10: я всегда получаю полный путь к моему каталогу сценариев как sys.path [0] (не cwd ''). У вас должно получиться выполнить что-то вродеpython some\other\path\than\cwd\main.py
ford04
Я согласен с @ ford04. Пункт 1 неверен: в Windows к sys.path добавляется каталог сценария, а не пустой путь или cwd. Это есть в различных установках Python 3.x.
gwideman
1
Вау, это круто! Я видел около 10 других вопросов и ответов, прежде чем наткнуться на эту «правду», даже если вы смиренно признаете, что у вас всего этого нет.
Майк Уильямсон
1
Я хотел бы добавить , что соответствующие файлы site-packagesимеют .pthи .egg-linkсуффиксы.
Флорисла