2009-05-22 3 views
68

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

Мой PYTHONPATH является:

PYTHONPATH=c:\testdir 

Интересно, где эти пути до тех PYTHONPATH прибывают из?

ответ

36

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

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

+5

Я предполагаю, что они пришли из модуля сайта: http://docs.python.org/library/site.html – ashcatch

+12

The модуль сайта нагрузка и анализируют содержимое любых .pth файлов на вашем сайте-пакетах каталог. Эти .pth файлы содержат дополнения к вашему PYTHONPATH – ASk

29

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

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

Затем он определяет начальные значения для 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_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 не было найдено еще, то питон наборы 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 устанавливается истина в 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, если префикс не был найден, то питон будет пытаться определить его с помощью функции поиска всех каталогов, в 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, а также проверяет добавленный путь для файлов конфигурации.

+1

Несмотря на то, что говорят его документы, 'sys.executable' может быть символической ссылкой, или на самом деле это может быть что угодно, если' argv [0] 'содержит слэши. Фактический * путь * к исполняемому файлу (из 'execv (path, argv)' call) не используется. – jfs

Смежные вопросы