Я пытаюсь запретить пользователям использовать 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/