Звідки ініціалізований sys.path Python?


111

Звідки ініціалізований 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

Цікаво, звідки беруться ці шляхи до ПІТОНПАТУ?

Відповіді:


49

"Ініціалізований із змінної середовища PYTHONPATH, плюс встановлений залежно від встановлення"

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


7
Я здогадуюсь, що вони надходять з сайту сайту: docs.python.org/library/site.html
ashcatch

20
Модуль сайту завантажує і аналізує вміст будь-яких .pth файлів у каталозі пакунків-сайтів. Ці файли .pth містять доповнення до вашого PYTHONPATH
Запитайте

77

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.

  1. Доданий каталог сценарію, до якого виконується python sys.path. У Windows це завжди порожня рядок, яка вказує python використовувати повний шлях, де замість цього знаходиться сценарій.
  2. Вміст змінної середовища PYTHONPATH, якщо встановлено, додається до sys.path, якщо ви не знаходитесь у Windows та applocalвстановлено значення true 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, якщо не було знайдено префікса, 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, а також перевіряє щойно доданий шлях на конфігураційні файли.


1
Незважаючи на те, що кажуть його документи, це sys.executableможе бути символьним посиланням, або насправді це може бути будь-що, якщо argv[0]містить косу рису. Фактичний шлях до виконуваного файлу (від execv(path, argv)виклику) не використовується.
jfs

1
Щодо вашого першого пункту sys.pathщодо Windows 10: Я завжди отримую повний шлях мого сценарію dir як sys.path [0] (не cwd ''). Ви повинні мати можливість виконати щось на зразокpython some\other\path\than\cwd\main.py
ford04

Я згоден з @ ford04. Пункт 1 невірний: у Windows каталог сценарію додається до sys.path, а не порожній шлях, ні cwd. Це в різних установках Python 3.x.
gwideman

1
Ого, це приголомшливо! Я бачив близько 10 інших запитань і відповідей, перш ніж натрапляти на цю "правду", навіть якщо ви з приниженням визнаєте, що не все це маєте.
Майк Вільямсон

1
Я хотів би додати , що відповідні файли site-packagesмають .pthі .egg-linkсуфікси.
флорисла
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.