Где манипулируется Python путь? - PullRequest
1 голос
/ 21 февраля 2020

На одном сервере я могу импортировать библиотеку, на втором - нет. Библиотека, которую мне нужно импортировать, используется совместно через NFS и доступна обоим серверам.

Я обнаружил, что путь Python отличается между двумя серверами, но двоичный файл Python одинаков, установлен из Стандартные репозитории Ubuntu 16.04 и $PYTHONPATH не установлены на обоих серверах.

Сервер 1:

$ echo $PYTHONPATH

$ python
>>> import sys; sys.path
['', '/usr/lib/python2.7', '...', '/usr/local/lib/python2.7/dist-packages', '/home/user/app/src/python', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/wx-3.0-gtk2']

Сервер 2:

$ echo $PYTHONPATH

$ python
>>> import sys; sys.path
['', '/usr/lib/python2.7', '...', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

Как я понимаю, где определена ли эта библиотека для репликации того же поведения на сервер 2?

Любопытно, что библиотека расположена между путями /usr/local/lib и /usr/lib.

Редактировать: Двоичный файл python такой же (та же версия 2.7.12, и контрольные суммы совпадают), и он устанавливается из репозиториев Ubuntu в стандартном месте /usr/bin/python.
Я играл с библиотекой site и всеми переменные одинаковы (site.ENABLE_USER_SITE возвращает True).
Я знаю, что могу манипулировать путями внутри скрипта или указать PYTHONPATH в /etc/profile.d/ для всех серверов, но я хотел бы знать где разница.

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Я обнаружил существование файлов конфигурации пути в Python. Из do c модуля сайта на Python 3 :

Он начинается с создания до четырех каталогов из головной и хвостовой частей. Для головной части он использует sys.prefix и sys.exec_prefix; пустые головы пропускаются. Для хвостовой части он использует пустую строку, а затем lib / site-packages (на Windows) или lib / pythonX.Y / site-packages (на Unix и Macinto sh). Для каждой из различных комбинаций «голова-хвост» он видит, ссылается ли он на существующий каталог, и, если да, добавляет его в sys.path, а также проверяет вновь добавленный путь для файлов конфигурации.
...
Файл конфигурации пути - это файл, имя которого имеет форму name.pth и существует в одном из четырех каталогов, упомянутых выше; его содержимое - это дополнительные элементы (по одному на строку), которые нужно добавить в sys.path. Несуществующие элементы никогда не добавляются в sys.path, и не выполняется проверка того, что элемент ссылается на каталог, а не на файл. Ни один элемент не добавляется в sys.path более одного раза. Пустые строки и строки, начинающиеся с #, пропускаются. Строки, начинающиеся с импорта (после пробела или табуляции), выполняются.

В моем случае в /usr/local/lib/python2.7/dist-packages/easy-install.pth был файл, отсутствующий на втором сервере.

Отключение automati c импорт этих файлов с python -S может оказаться полезным при отладке.

К сожалению, я не нашел способа получить список каталогов, из которых считываются файлы конфигурации пути.

0 голосов
/ 21 февраля 2020

В документации по модулю Sys указано, что sys.path - это

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

См .: https://docs.python.org/3/library/sys.html

Поэтому должны быть другие зависящие от установки по умолчанию . Проверьте точные python версии. Может быть, python бинарные файлы модулей приходят из разных репозиториев apt. Может быть, python команды приходят из разных мест на обоих серверах - проверьте это:

which python

Также проверьте модуль сайта - кажется, что он контролирует дополнительные пути , См .: http://docs.python.org/3/library/site.html

Я бы импортировал его и проверил сайт.ENABLE_USER_SITE Может быть, он даст вам некоторую подсказку, где разница

...