Откуда инициализируется sys.path Python? - PullRequest
91 голосов
/ 22 мая 2009

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

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

Ответы [ 2 ]

58 голосов
/ 15 июля 2016

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.

  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, а также проверяет вновь добавлен путь для файлов конфигурации.

44 голосов
/ 22 мая 2009

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

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

...