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.prefixLinux, Mac та Windows, з sys.exec_prefixтаким же значенням, що і в
sys.prefixWindows. Весь цей крок пропускається у 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, а також перевіряє щойно доданий шлях на конфігураційні файли.