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

Где инициализируется 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']

My PYTHONPATH:

    PYTHONPATH=c:\testdir

Интересно, откуда берутся эти пути до PYTHONPATH?

Ответ 2

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 нет настройки 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.

  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 не было установлено pyvenv.cfg, то содержимое подразделов раздела реестра HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ добавляются, если таковые имеются.
  5. Если в Windows и applocal = true не было установлено в pyvenv.cfg, и sys.prefix не может быть найден, затем добавляется основное содержимое раздела реестра HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\, если он существует;
  6. Если в Windows и applocal = true не было установлено pyvenv.cfg, то содержимое подразделов раздела реестра HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\ добавляются, если таковые имеются.
  7. Если в Windows и applocal = true не было установлено в 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, а также проверяет вновь добавлен путь для файлов конфигурации.