Откуда инициализируется 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?
Python действительно очень старается грамотно настроить
sys.path
. Как это установить, может быть очень сложно . Следующее руководством является разбавленным, несколькими-неполным, несколько-так, но , надеюсь, полезное руководством для неприметного питона программиста , что происходит , когда питон выясняет , что использовать в качестве начальных значений изsys.path
,sys.executable
,sys.exec_prefix
, иsys.prefix
на обычной установке python.Во-первых, python делает все возможное, чтобы определить свое фактическое физическое местоположение в файловой системе на основе того, что ему сообщает операционная система. Если ОС просто говорит, что «python» запущен, он оказывается в $ PATH. Он разрешает любые символические ссылки. Как только он это сделает, путь к исполняемому файлу, который он найдет, будет использоваться в качестве значения
sys.executable
, без «если», «и» или «но».Затем он определяет начальные значения для
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 и Macsys.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
.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
было установлено nopyvenv.cfg
, тоHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
добавляется содержимое подразделов раздела реестра , если таковые имеются.applocal = true
было задано nopyvenv.cfg
иsys.prefix
его не удалось найти, то добавляется основное содержимое раздела реестраHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
, если оно существует;applocal = true
было установлено nopyvenv.cfg
, тоHK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
добавляется содержимое подразделов раздела реестра , если таковые имеются.applocal = true
было задано nopyvenv.cfg
иsys.prefix
его не удалось найти, то добавляется основное содержимое раздела реестраHK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
, если оно существует;sys.prefix
.sys.exec_prefix
добавляется значение. В Windowssys.prefix
добавляется каталог, который использовался (или мог бы использоваться) для динамического поиска .На этом этапе в Windows, если префикс не был найден, python попытается определить его, выполнив поиск во всех каталогах
sys.path
файлов ориентиров, как он пытался сделать с каталогомsys.executable
ранее, пока не найдет что-нибудь. Если этого не происходит,sys.prefix
остается пустым.Наконец, после всего этого Python загружает
site
модуль, который добавляет еще кое-что кsys.path
:источник
sys.executable
может быть символическая ссылка или что угодно, если онаargv[0]
содержит косые черты. Фактический путь к исполняемому файлу (отexecv(path, argv)
вызова) не используется.sys.path
Windows 10: я всегда получаю полный путь к моему каталогу сценариев как sys.path [0] (не cwd ''). У вас должно получиться выполнить что-то вродеpython some\other\path\than\cwd\main.py
site-packages
имеют.pth
и.egg-link
суффиксы.