Как заблокировать пользовательские пакеты pip и python?

Как заблокировать пользовательские пакеты pip и python?

Я пытаюсь запретить пользователям использовать pip для установки пакетов в свои домашние каталоги.

Вывод из python3 -m site --helpбудет показывать, что суперпользователь может отключить каталог сайта пользователя. Но как это сделать? Я пробовал устанавливать site.ENABLE_USER_SITEиз , sitecustomize.pyно это не помогает. Установка PYTHONNOUSERSITE=1в среде или передача -sв python работает, но это не совсем настройка суперпользователя.

Я также пытался подойти к этому, как-то отключив pip для пользователей. Мы были бы вполне довольны, если бы пакеты устанавливались в окружения venv, но не в домашние каталоги пользователей. Есть ли что-нибудь, что я могу вставить, pip.confчтобы принудительно отключить --userустановки.

решение1

В:Можно ли что-нибудь добавить в pip.conf, чтобы принудительно отключить установку --user?

А:Нет. Файл конфигурации всегда можно переопределить в соответствии с приоритетом, определенным вpip-документы:

Параметры командной строки имеют приоритет над переменными среды, которые имеют приоритет над файлом конфигурации.

В:Суперпользователь может отключить каталог сайта пользователя. Но как это сделать? Настройка PYTHONNOUSERSITE=1в среде или передача -sв python работает, но это не совсем настройка суперпользователя.

А:Я пришел к этому вопросу через Google, потому что обнаружил полную противоположность — я не вижу PYTHONNOUSERSITEфактического изменения поведения pip:

$ docker run --net=host -it python:3.8 bash

$ pip install -U pip
Requirement already up-to-date: pip in /usr/local/lib/python3.8/site-packages (20.2.2)

$ ls -ltr ~/.local
ls: cannot access '/root/.local': No such file or directory

$ PYTHONNOUSERSITE=1 pip install --user typing-extensions
Collecting typing-extensions
  Downloading typing_extensions-3.7.4.3-py3-none-any.whl (22 kB)
Installing collected packages: typing-extensions
Successfully installed typing-extensions-3.7.4.3

$ ls -ltr ~/.local
total 4
drwxr-xr-x 3 root root 4096 Aug 24 07:08 lib

Theдокументы дляPYTHONNOUSERSITEутверждать, что:

Если этот параметр установлен, Python не будет добавлять каталог site-packages пользователя в sys.path.

Поэтому, хотя я и был удивлен поведением, я полагаю, что для pip разумно все равно установить его, PYTHONUSERBASEдаже если эта переменная установлена ​​(даже если в результатеустановленпакет не будет доступен в пути Python).

Я нашелсоответствующий вопрос на трекере проблем pipи похоже, что уже есть особый случай для venv, у которых отключены системные пакеты сайта (по умолчанию), и им не разрешено выполнять пользовательские установки (я специально это не проверял).

Итак, следуя решению этого первоначального отчета об ошибке, мы приходим к запросу на включение, который имеет некоторыеинтересные особенности. А именно, по-видимому, есть специальный файл, который может создать суперпользователь, ````, который отключает установку пользовательского сайта-пакета. Я также нашелвопрос по SO, касающийся этого. Я попробовал это, но, к сожалению, он все равно продолжал устанавливаться в пользовательскую базу:

$ touch /usr/local/lib/python3.8/no-global-site-packages.txt

$ pip install --user typing-extensions
...
Successfully installed typing-extensions-3.7.4.3

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

Оказывается, ключевая функция — этоdecide_user_site, которыйделаетчестьsite.ENABLE_USER_SITEценность, нотолькопосле проверки явного userаргумента. Как мы видим в самой функции, это асимметрично с тем, как обрабатываются виртуальные среды, что предотвратит глобальные/пользовательские установки, если виртуальная среда отключила их. Я считаю это ошибкой и поднял ее вhttps://github.com/pypa/pip/issues/8794.

Итак, ответ таков: насколько я могу судить, в настоящее время невозможно отключить --userустановку в базовой (т.е. невиртуальной) среде. Когда этоявляетсяэто возможно сделать (надеюсь, когда проблема, указанная выше, будет устранена), можно использовать переменные среды -sи PYTHONNOUSERSITE=1, но способ «sys-admin», который, как я думаю, вы ищете, заключается в измененииsite.py напрямую, как описано в реализации site.py.

решение2

Старая тема, но вот возможное решение. Заставьте pip иметь виртуальную среду и не устанавливать ее непосредственно на сайте пользователя.

export PIP_REQUIRE_VIRTUALENV=true

Вот соответствующая ссылка: https://docs.python-guide.org/dev/pip-virtualenv/

Связанный контент