Вопрос по python – Создание вторичного каталога site-packages (и загрузка пакетов из файлов .pth в нем)

18

Я хотел бы установить некоторые пакеты в сторонниеsite-packages каталог (за пределами стандартных системных расположений). Есть ли способ установить это так, чтобы .pth файлы в нем уважались?

Предыстория: я использую OS X, virtualenv и homebrew. Есть несколько пакетов (в частности, wxPython в моем случае), которые не устанавливаются через pip в virtualenv. В этих случаях, есть пакеты домашнего приготовления, которые работают вместо них. Homebrew создает третью папку site-packages в/usr/local/lib/python2.7, Я хотел бы просто указать на эту папку и оставить там все пункты обслуживанияbrewконтроль. Кажется, однако, что это невозможно.

Appending to the path via $PYTHONPATH does not load .pth files. (Should Python 2.6 on OS X deal with multiple easy-install.pth files in $PYTHONPATH?) Python does not allow nesting or recursive use of .pth files. (Nested .pth Files or Loading Extra site-dirs from a Network) The wrapper for virtualenv add2virtualenv adds some extra smarts to the .pth file beyond simply having the directory listed, but I believe it simply reorders the path list.

Я, конечно, не единственный, кто интересуется этим вопросом. Я держу пари, что большое количество общих файлов pth не работает. вопросы и сообщения в сети, на которые я наткнулся, связаны с этой проблемой. Есть ли хорошее решение?

Ваш Ответ

2   ответа
18

Сайт модуль. Предоставляет функциюaddsitedir который должен делать то, что ты хочешь.

Самый простой способ использовать это - создать файл с именемsitecustomize.py илиusercustomize.py и поместите его в текущийPYTHONPATH каталог (или любой каталог, который заканчивается наsys.path) со следующим содержанием:

import site
site.addsitedir('/usr/local/lib/python2.7')

Когда Python запускается, делается попытка импортироватьsitecustomize а потомusercustomize, вот почему это работает. Из документации сайта:

После этих манипуляций делается попытка импортировать модуль с именемsitecustomize, который может выполнять произвольные настройки для конкретного сайта. Обычно он создается системным администратором в каталоге site-packages. Если этот импорт не удается сImportError исключение, оно молча игнорируется.

После этого делается попытка импортировать модуль с именемusercustomize, который может выполнять произвольные пользовательские настройки, еслиENABLE_USER_SITE правда. Этот файл предназначен для создания в каталоге пользовательских пакетов сайта (см. Ниже), который является частьюsys.path если не отключено-s. АнImportError будет игнорироваться.

Ответьте мне: различие использования site.addsitedir в том, что файл .pth «выполняется». Однако мой коллега говорит мне, что эта функция больше не нужна. Кто-нибудь не согласится? Juh_
Do sitecustomize.py или usercustomize.py автоматически запускаются при запуске? Редактировать: да, да, они делают. Благодарность Matt B.
Подсказка: используйтеusercustomize. В некоторых дистрибутивах Linux существует глобальная настройка сайта, в некоторых - нет. Это может привести к запутанному поведению. Ни один дистрибутив Linux не предоставляет пользовательскую настройку. guettli
@ MattB. Да, отредактировал мой ответ с некоторой дополнительной информацией. Документация взята из верхней части страницы модуля сайта, на которую я ссылаюсь в своем ответе. Andrew Clark
Я до сих пор не до конца понимаю, как работает сайт, но: (1) не следует по additedir ('/ usr / local'), то есть альтернативному префиксу (но он не работает для меня), или (2) additedir ('/ usr / local / lib / python2.7 / site-packages') путь для добавления, и во втором случае почему бы просто не добавить его в PYTHONPATH? Juh_
1

PEP 370 специально посвященный созданию каждого пользователяsite-packages каталоги, чтобы справиться с ситуацией, когда пользователь не имеет административного доступа к общесистемнойsite-packages.

Например, в Unix (включая Mac OS), и если предположить, что кто-то использует Python 3.6, можно создать следующий каталог и поместить.pth файлы внутри

~/.local/lib/python3.6/site-packages

Похожие вопросы