Вопрос

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

УПД: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?

Это было полезно?

Решение

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

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

Другие советы

Python действительно старается разумно установить sys.path.Как это настроено, может получить Действительно сложный.Следующее руководство представляет собой размахиваемое, несколько неполное, несколько громкое, но, надеемся начальные значения из sys.path, sys.executable, sys.exec_prefix, и sys.prefix на нормальныйустановка питона.

Во -первых, Python делает все возможное, чтобы выяснить свое фактическое физическое местоположение в файловой системе, основываясь на том, что говорит операционная система.Если ОС просто сообщает, что «python» запущен, она оказывается в $PATH.Он разрешает любые символические ссылки.Как только это сделает это, путь исполняемого, который он находит, используется в качестве значения для sys.executable, нет IFS, и, или нот.

Далее он определяет начальные значения для sys.exec_prefix и sys.prefix.

Если существует файл с именем pyvenv.cfg в том же каталоге, что иsys.executable или на один каталог выше, Python просматривает его.Разные OSES делают разные вещи с этим файлом.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top