Предоставление доступа к установленной пользователем дистрибутиву Python другому пользователю Linux.

Вопрос или проблема

(Я не уверен, к какому сайту 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 будет знать, где искать необходимые модули.

Как вы уже заметили, модули, установленные в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!

Оцените материал
Добавить комментарий

Капча загружается...