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