Вопрос или проблема
(Я не уверен, к какому сайту SE относится мой вопрос, я колебался между stackoverflow, serverfault и superuser. Не стесняйтесь оставить свои предложения об этом в комментариях.)
Вот моя проблема:
У меня два пользователя на моем компьютере с linux, bli
и pquarato
. bli
установил python3.6 локально (компилировал из исходников с помощью ./configure --prefix=${HOME}
). Бинарный файл установлен в /home/bli/bin
, pip3.6 устанавливает вещи в /home/bli/.local/lib/python3.6/site-packages
. Например, numpy установлен там:
(bli) $ pip3.6 install numpy
Требование уже удовлетворено: numpy в /home/bli/.local/lib/python3.6/site-packages
Я хочу, чтобы pquarato
мог использовать установку python от bli
. bli
выполнил chmod -R a+rx
на /home/bli/bin
и /home/bli/.local
.
pquarato
может использовать бинарный файл python3.6 от bli
, но не может импортировать модули, установленные с помощью pip3.6:
(pquarato) $ /home/bli/bin/python3.6 -c 'import numpy'
Traceback (most recent call last):
File "<string>", line 1, in <module>
ModuleNotFoundError: Нет модуля с именем 'numpy'
Вышеуказанное работает без ошибок для bli
.
Что ещё мне нужно сделать?
Примечание: На самом деле я впервые столкнулся с проблемой, пытаясь заставить pquarato
использовать программы, такие как ipython3:
(pquarato) $ /home/bli/.local/bin/ipython3
Traceback (most recent call last):
File "/home/bli/.local/bin/ipython3", line 6, in <module>
from pkg_resources import load_entry_point
File "/home/bli/lib/python3.6/site-packages/pkg_resources/__init__.py", line 3017, in <module>
@_call_aside
File "/home/bli/lib/python3.6/site-packages/pkg_resources/__init__.py", line 3003, in _call_aside
f(*args, **kwargs)
File "/home/bli/lib/python3.6/site-packages/pkg_resources/__init__.py", line 3030, in _initialize_master_working_set
working_set = WorkingSet._build_master()
File "/home/bli/lib/python3.6/site-packages/pkg_resources/__init__.py", line 659, in _build_master
ws.require(__requires__)
File "/home/bli/lib/python3.6/site-packages/pkg_resources/__init__.py", line 967, in require
needed = self.resolve(parse_requirements(requirements))
File "/home/bli/lib/python3.6/site-packages/pkg_resources/__init__.py", line 853, in resolve
raise DistributionNotFound(req, requirers)
pkg_resources.DistributionNotFound: Дистрибутив 'ipython==6.2.1' не найден и требуется приложением
Я надеюсь, что одно и то же решение решит как ModuleNotFoundError
, так и вышеуказанную проблему DistributionNotFound
.
Я добавил следующее в /home/pquarato/.bashrc
:
export PYTHONPATH="/home/bli/.local/lib/python3.6/site-packages"
Это, пох看来, решает обе проблемы (ModuleNotFoundError
и DistributionNotFound
).
Файл .bashrc
необходимо загрузить, прежде чем это вступит в силу.
Это, вероятно, нужно будет адаптировать в зависимости от используемой пользователем оболочки.
Правка
Установка PYTHONPATH
не работает с локальными пакетами, которые были установлены как *.egg-link
с помощью pip3.6 install -e
. В таких случаях по-прежнему возникает ModuleNotFoundError
.
Ответ или решение
Доступ к локальной установке Python для другого пользователя в Linux
Когда речь идет о предоставлении доступности установленного локально дистрибутива Python для другого пользователя в Linux, важно учитывать несколько ключевых шагов для успешной реализации этой задачи. В данном случае мы имеем двух пользователей: bli
, который установил Python 3.6 локально, и pquarato
, который хочет использовать Python и его модули, установленные bli
. Давайте по шагам разберем, что необходимо сделать.
1. Права доступа
Первым делом необходимо убедиться, что права доступа к директориям и файлам настройки для Python корректно установлены. Вы упомянули, что bli
выполнил команду chmod -R a+rx
на директориях /home/bli/bin
и /home/bli/.local
. Это действительно необходимо, чтобы другие пользователи могли читать и выполнять файлы, находящиеся в этих директориях.
chmod -R a+rx /home/bli/bin
chmod -R a+rx /home/bli/.local
2. Установка переменной окружения PYTHONPATH
Следующим шагом является настройка переменной окружения PYTHONPATH
для пользователя pquarato
. Это позволяет интерпретатору Python знать, где искать дополнительные модули. Для этого необходимо добавить следующую строку в файл ~/.bashrc
или ~/.bash_profile
пользователя pquarato
:
export PYTHONPATH="/home/bli/.local/lib/python3.6/site-packages"
Не забудьте прогрузить изменения, выполнив команду:
source ~/.bashrc
Эта настройка исправит проблему с ModuleNotFoundError
и ошибкой DistributionNotFound
, так как Python будет знать, где искать необходимые модули.
3. Проблема с *.egg-link файлами
Как вы уже заметили, модули, установленные вeditable (например, с помощью pip install -e
), могут не работать корректно с установленным PYTHONPATH
. Это связано с тем, что такие установки создают временные ссылки *.egg-link
, которые могут не учитываться в пользовательских настройках.
Решение данной проблемы может заключаться в следующем:
-
Убедитесь, что
pquarato
имеет права доступа к директории, где находятся ссылки. Возможно, потребуется обновить права для этой конкретной директории. -
В некоторых случаях может потребоваться добавить путь к директории, содержащей
*.egg-link
, вPYTHONPATH
. Пример:
export PYTHONPATH="/home/bli/.local/lib/python3.6/site-packages:/home/bli/.local/lib/python3.6/site-packages/some_module.egg-link"
4. Дополнительные Примечания
-
Если
pquarato
использует другой шелл (например, zsh или fish), необходимо учесть соответствующие изменения для файлов конфигурации (~/.zshrc
,~/.config/fish/config.fish
и т.д.). -
Дополнительно, для управления версиями Python и изоляцией проектов можно рассмотреть использование таких инструментов, как
pyenv
илиvirtualenv
.
Заключение
Следуя вышеописанным шагам, пользователь pquarato
сможет успешно использовать установленные модули Python, находящиеся в локальной среде bli
. Важно постоянно проверять права доступа и следить за всеми изменениями в окружении. Успехов в дальнейшей работе с Python!