Как python36 инициализирует PYTHONPATH? - PullRequest
0 голосов
/ 26 июня 2018

Две новые установленные с одной и той же виртуальной машины с одинаковыми версиями python36 имеют разные значения для sys.path:

1-я виртуальная машина

[root@vm1 ~]# python36 -m site
sys.path = [
    '/root',
    '/usr/lib64/python36.zip',
    '/usr/lib64/python3.6',
    '/usr/lib64/python3.6/lib-dynload',
    '/usr/lib64/python3.6/site-packages',
    '/usr/lib/python3.6/site-packages',
]
USER_BASE: '/root/.local' (doesn't exist)
USER_SITE: '/root/.local/lib/python3.6/site-packages' (doesn't exist)
ENABLE_USER_SITE: True

2-я виртуальная машина

[root@vm2 ~]# python36 -m site
sys.path = [
    '/root',
    '/usr/lib64/python36.zip',
    '/usr/lib64/python3.6',
    '/usr/lib64/python3.6/lib-dynload',
    '/usr/local/lib64/python3.6/site-packages',
    '/usr/local/lib/python3.6/site-packages',
    '/usr/lib64/python3.6/site-packages',
    '/usr/lib/python3.6/site-packages',
]
USER_BASE: '/root/.local' (doesn't exist)
USER_SITE: '/root/.local/lib/python3.6/site-packages' (doesn't exist)
ENABLE_USER_SITE: True

2-я виртуальная машина по некоторым причинам имеет пути / usr / local / lib *.

os.environ на обеих машинах показывает одинаковые значения для переменных:

  • нет пользовательских значений пути для PYTHONPATH
  • исходных переменных PATH (не знаю, если ониподключены к PYTHONPATH) также те же

    [root @ vm1 ~] env |grep -E "^ PATH =" PATH = / usr / local / sbin: / usr / local / bin: / usr / sbin: / usr / bin: / opt / java / latest / bin: / opt / java / latest /jre / bin: / root / bin

Как python36 инициализирует PYTHONPATH (sys.path) во время начальной установки, когда не настроены пользовательские значения на стороне ОС для PYTHONPATH?

1 Ответ

0 голосов
/ 26 июня 2018

Ожидается, что обычная установка сможет работать без какой-либо переменной окружения PYTHONPATH.Как объяснено в документации, для пользователя существует PYTHONPATH, чтобы…

Дополнить путь поиска по умолчанию для файлов модулей.Формат такой же, как у PATH оболочки: одно или несколько путей к каталогам, разделенных os.pathsep (например, двоеточия в Unix или точки с запятой в Windows).Несуществующие каталоги игнорируются.

Таким образом, ни один из стандартных установщиков Python (включая сборку локально и под управлением make install, а также двоичные установщики Windows и macOS доступны в разделе Загрузки на python.org) сделать что-нибудь, чтобы создать PYTHONPATH значение или настроить его в вашей среде.И большинство полуофициальных и сторонних пакетов (например, Pythons включает или упаковываются в дистрибутивы Linux и Apple, установщики менее распространенных платформ в разделе Downloads / Other, «батареи плюс» дистрибутивы Python, такие как Anaconda и т. Д.), Будут работатьтаким же образом.


Обратите внимание, что каталоги PYTHONPATH добавляются в путь поиска по умолчанию.Как отмечено в тех же документах:

Путь поиска по умолчанию зависит от установки, но обычно начинается с префикса / lib / pythonversion (см. PYTHONHOME выше).Он всегда добавляется к PYTHONPATH.

Дополнительный каталог будет вставлен в путь поиска перед PYTHONPATH, как описано выше в разделе Параметры интерфейса.Путь поиска может управляться из программы Python как переменная sys.path.

Это также объясняется в sys.path:

Список строк, который указывает путь поиска для модулей.Инициализируется из переменной среды PYTHONPATH, плюс зависящее от установки значение по умолчанию.

При инициализации при запуске программы первый элемент этого списка, путь [0], является каталогом, содержащим скрипт, который использовался для вызоваИнтерпретатор Python.Если каталог скриптов недоступен (например, если интерпретатор вызывается в интерактивном режиме или если скрипт читается из стандартного ввода), path [0] является пустой строкой, которая направляет Python для поиска модулей в текущем каталоге в первую очередь.Обратите внимание, что каталог сценариев вставляется перед записями, вставленными в результате PYTHONPATH.

См. Также Модуль site Здесь описывается, как использовать файлы .pth.для расширения sys.path.

В отличие от PYTHONPATH, этот site механизм иногда используется сторонними и полуофициальными установками.Например, Apple использует его для добавления библиотеки Extras предустановленных пакетов, таких как pyobjc, во встроенный Python 2.7 на macOS.


Если вам интересно, как это зависит от установкиdefault "загружается модулем sys в CPython, в конечном итоге сводится к общедоступной функции C API, Py_GetPath:

Возвращает путь поиска модуля по умолчанию;это вычисляется из имени программы (установленного Py_SetProgramName () выше) и некоторых переменных окружения.Возвращаемая строка состоит из серии имен каталогов, разделенных символом разделителя, зависящим от платформы.Символ разделителя: ':' в Unix и Mac OS X, ';'на винде.Возвращенная строка указывает на статическое хранилище;вызывающая сторона не должна изменять свое значение.Список sys.path инициализируется этим значением при запуске интерпретатора;его можно (и обычно) изменить позже, чтобы изменить путь поиска для загрузки модулей.

Если вы хотите увидеть, как работает код C, вы, вероятно, захотите начать с _PyPathConfig_Init, потому что фактический Py_GetPath просто вызывает функцию, которая проверяет, был ли он вызван, а затем извлекает значение из структуры, которую он устанавливает.

...