Python дійсно намагається розумно налаштувати sys.path
. Як це встановлено, може стати справді складним . Наступне керівництвом є розведеним, декількома-неповним, кілька-так, але , сподіваюся, корисне керівництвом для непримітного пітона програміста , що відбувається , коли пітон з'ясовує , що використовувати в якості початкових значень з sys.path
,
sys.executable
, sys.exec_prefix
, і sys.prefix
на звичайній
установці пітона.
По-перше, python робить свій рівень найкращим чином, щоб визначити його фактичне фізичне розташування у файловій системі, виходячи з того, що йому каже операційна система. Якщо ОС просто каже, що "python" працює, він опиняється в $ PATH. Він вирішує будь-які символічні посилання. Як тільки це зробить, шлях виконуваного файлу, який він знайде, використовується як значення для sys.executable
, без ifs, ands або 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
ще не знайдені, тоді python встановлює sys.prefix
значення «резервного». Наприклад, Linux та Mac використовують попередньо складені параметри за замовчуванням як значення sys.prefix
та sys.exec_prefix
. Windows чекає, поки sys.path
повністю не з'ясується, щоб встановити резервне значення
sys.prefix
.
Потім (те, чого ви всі чекали), python визначає початкові значення, які мають міститися sys.path
.
- Доданий каталог сценарію, до якого виконується python
sys.path
. У Windows це завжди порожня рядок, яка вказує python використовувати повний шлях, де замість цього знаходиться сценарій.
- Вміст змінної середовища PYTHONPATH, якщо встановлено, додається до
sys.path
, якщо ви не знаходитесь у Windows та applocal
встановлено значення true pyvenv.cfg
.
- Додано шлях до zip-файлів, який знаходиться
<prefix>/lib/python35.zip
в Linux / Mac та
os.path.join(os.dirname(sys.executable), "python.zip")
Windows sys.path
.
- Якщо для Windows і не
applocal = true
було встановлено pyvenv.cfg
, то вміст підрозділів ключа реєстру
HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
додається, якщо такі є.
- Якщо в Windows і не
applocal = true
було встановлено pyvenv.cfg
, і sys.prefix
його не вдалося знайти, тоді додається основний вміст ключа реєстру HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
, якщо він існує;
- Якщо для Windows і не
applocal = true
було встановлено pyvenv.cfg
, то вміст підрозділів ключа реєстру
HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\
додається, якщо такі є.
- Якщо в Windows і не
applocal = true
було встановлено pyvenv.cfg
, і sys.prefix
його не вдалося знайти, тоді додається основний вміст ключа реєстру HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\
, якщо він існує;
- Якщо для Windows, а PYTHONPATH не було встановлено, префікс не знайдено, а ключі реєстру не були, тоді відносне значення компіляції PYTHONPATH додається; в іншому випадку цей крок ігнорується.
- Шляхи до макросу часу компіляції додаються PYTHONPATH відносно динамічно знайденого
sys.prefix
.
- Для 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, а також перевіряє щойно доданий шлях на конфігураційні файли.