Estou tentando impedir que os usuários usem o pip para instalar pacotes em seus diretórios pessoais.
A saída de python3 -m site --help
indicaria que é possível para um superusuário desabilitar o diretório do site do usuário. Mas como é que isto é feito? Eu tentei configurar site.ENABLE_USER_SITE
de a, sitecustomize.py
mas isso não ajuda. Definir PYTHONNOUSERSITE=1
no ambiente ou passar -s
para python funciona, mas não é exatamente um ajuste de superusuário.
Também tentei abordar isso desabilitando de alguma forma o pip para os usuários. Ficaríamos muito felizes se os pacotes fossem instalados em ambientes venv, mas não nos diretórios pessoais dos usuários. Existe algo que eu possa colocar pip.conf
para desativar --user
as instalações à força.
Responder1
P:Existe algo que eu possa colocar no pip.conf para desabilitar à força as instalações do usuário.
A:Não. O arquivo de configuração sempre pode ser substituído de acordo com a precedência definida nodocumentos pip:
As opções de linha de comando têm precedência sobre variáveis de ambiente, que têm precedência sobre o arquivo de configuração.
P:É possível que um superusuário desabilite o diretório do site do usuário. Mas como é que isto é feito? Definir PYTHONNOUSERSITE=1
no ambiente ou passar -s
para python funciona, mas não é exatamente um ajuste de superusuário.
A:Cheguei a esta questão através do Google porque estava descobrindo exatamente o oposto - não vejo PYTHONNOUSERSITE
realmente uma mudança no comportamento do 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
Odocumentos paraPYTHONNOUSERSITE
declarar que:
Se estiver definido, o Python não adicionará o diretório site-packages do usuário ao sys.path.
Portanto, embora eu tenha ficado surpreso com o comportamento, suponho que seja razoável que o pip ainda seja instalado, PYTHONUSERBASE
mesmo que esta variável esteja definida (mesmo que o resultadoinstaladopacote não estará disponível no caminho Python).
Achei umproblema relevante no pip issue trackere parece que já existe um caso especial para venvs que têm pacotes de sites do sistema desabilitados (o padrão) não tendo permissão para fazer instalações de usuário (não verifiquei isso explicitamente).
Então, seguindo para a solução do relatório de bug original, chegamos a uma solicitação pull que tem algunsrecursos interessantes. Ou seja, aparentemente existe um arquivo especial que um superusuário pode criar, ````, que desativa a instalação do pacote de sites do usuário. Eu também encontrei umpergunta sobre SO relacionada a este. Então tentei isso, mas infelizmente ainda continuou a ser instalado na base de usuários:
$ touch /usr/local/lib/python3.8/no-global-site-packages.txt
$ pip install --user typing-extensions
...
Successfully installed typing-extensions-3.7.4.3
Claro, isso faz sentido quando lemos o verdadeiroimplementação de solicitação pullque verifica esse arquivo apenas em situações de virtualenv. No meu caso, quero podersempredesabilitar esse comportamento, então vou me aprofundar um pouco mais na base de código pip ...
Acontece que a função principal édecide_user_site
, qualfazhonrar osite.ENABLE_USER_SITE
valor, masapenasdepois de verificar o user
argumento explícito. Como podemos ver na própria função, isso é assimétrico com a forma como os ambientes virtuais são tratados, o que impedirá instalações globais/de usuário se um ambiente virtual os tiver desabilitado. Considero isso um bug e o levantei emhttps://github.com/pypa/pip/issues/8794.
Portanto, a resposta é: atualmente não é possível, até onde sei, desabilitar --user
instalações em um ambiente básico (ou seja, não virtual). Quandoépossível fazer isso (espero que quando o problema vinculado acima for corrigido) as variáveis de ambiente -s
e PYTHONNOUSERSITE=1
possam ser usadas, mas a maneira "sys-admin" de fazer isso que acho que você está procurando é modificarsite.py diretamente, conforme explicado na implementação do site.py.
Responder2
Tópico antigo, mas aqui está a solução possível. Force o pip a ter ambiente virtual e não instalar diretamente no site do usuário.
export PIP_REQUIRE_VIRTUALENV=true
Aqui está o link relevante: https://docs.python-guide.org/dev/pip-virtualenv/