Создание вторичного каталога сайтов-пакетов (и загрузка пакетов из .pth файлов в нем)
Я хотел бы установить некоторые пакеты в сторонний каталог site-packages
(помимо стандартных расположений системы). Есть ли способ установить это так, чтобы соблюдались файлы .pth?
Фон: я использую OS X, virtualenv и homebrew. В моем случае есть несколько пакетов (в частности, wxPython), которые не устанавливаются красиво через pip в virtualenv. В этих случаях есть домашние пакеты, которые работают вместо них. Homebrew создает третью папку пакетов сайтов в /usr/local/lib/python2.7
. Я хотел бы просто указать на эту папку и оставить содержание всех элементов там под brew
. Кажется, однако, что это невозможно.
Я, конечно, не единственный, кто интересуется этой проблемой. Я бы поставил большое количество общих вопросов "pth files not working" и сообщений в Интернете, которые я наткнулся на них, связаны с этой проблемой. Есть ли хорошее решение?
Ответы
Ответ 1
Взгляните на модуль site. Он предоставляет функцию 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
- true. Этот файл предназначен для создания в каталоге пользовательских сайтов-пакетов (см. Ниже), который является частью sys.path
, если не отключен с помощью -s
. ImportError
будет игнорироваться.
Ответ 2
Был PEP 370, специально предназначенный для создания каталогов для пользователей site-packages
, чтобы справиться с ситуацией, когда у пользователя нет доступ администратора к общесистемному site-packages
.
Например, в Unix (включая Mac OS) и при условии, что один использует Python 3.6, можно создать следующий каталог и разместить там .pth
файлы
~/.local/lib/python3.6/site-packages