Qual é o objetivo de "pip install --user ..."?

189

De pip install --help:

 --user      Install to the Python user install directory for your platform. Typically ~/.local/, or %APPDATA%\Python on
             Windows. (See the Python documentation for site.USER_BASE for full details.)

A documentação do site.USER_BASE é um buraco de minhoca aterrorizante de um assunto interessante do * NIX que eu não entendo.

Qual é o propósito --userem inglês simples? Por que instalar o pacote é ~/.local/importante? Por que não colocar um executável em algum lugar do meu $ PATH?

Rob Truxal
fonte
2
você pode import site; print site.USER_SITEimprimir o local da instalação. Para mim eu tenho /${HOME}/.local/lib/python${PY_MAJOR}.${PY_MINOR}/site-packages.
Trevor Boyd Smith
1
Em uma máquina host, /usr/local/lib/pythonX.X/dist-packagesé o diretório padrão para pacotes instalados pelo pip . Mas se um usuário quiser instalar pacotes específicos do usuário, ele poderá usá-lo $ sudo pip3 --user install some_package. Esse pacote permanecerá indisponível para grupos e outras pessoas que acessam esse host.
noobninja

Respostas:

223

o padrão do pip para instalar pacotes Python em um diretório do sistema (como /usr/local/lib/python3.4 ). Isso requer acesso root.

--user cria pacotes de instalação do pip em seu diretório pessoal, o que não requer privilégios especiais.

duskwuff -inactive-
fonte
1
Obrigado; isso faz sentido. Mas é o objetivo de --usergarantir que um pacote não seja executado como root? (Estou imaginando algo semelhante a como Wireshark / kismet / burpsuite opções para configurar políticas de grupo de acesso, assim não permitindo que todos os recursos do programa a ser executado como root. É que no caminho certo?) Ou é a --useropção apenas significou para permitir a instalação sem privilégios de root? Se for esse o caso, por que nunca uso sudo pip install foo_package? Eu nunca precisei de privilégios de root para instalar via pip antes.
Rob Truxal
12
@Rob Truxal. Eu acho que o ponto é que o pacote não será visto por outros usuários. Talvez você queira uma versão mais antiga / mais recente de um pacote, mas se o instalar no sistema, você irá estragar seus companheiros de trabalho.
NDEthos 18/05/19
4
ah! O --userparâmetro é sobre isolamento do usuário! Isso faz uma espécie de sentido ridículo. Obrigado @NDEthos!
Rob Truxal
ok, aqui está uma pergunta (noobish): suponha que eu tenha feito login como usuário foo e executei este comando pip install --user -r requirements.txt .. e tudo instalado corretamente. Então eu entrei como barra de usuário e executei o programa python da seguinte maneira: sudo -u foo ./odoo-bin .. será lido nos pacotes python que foram instalados para o usuário foo? Ou como isso funciona?
Abbood
1
também existe uma maneira de listar apenas os pacotes que estão instalados para o usuário atual? ou seja, algo parecido pip freeze --user?
abbood
24

--userinstala no site.USER_SITE.

Para o meu caso, foi /Users/.../Library/Python/2.7/bin. Então, eu adicionei isso ao meu PATH (no ~/.bash_profilearquivo):

export PATH=$PATH:/Users/.../Library/Python/2.7/bin
Roozbeh Zabihollahi
fonte
15

Outras respostas mencionam site.USER_SITEcomo onde os pacotes Python são colocados. Se você está procurando binários, eles entram {site.USER_BASE}/bin.

Se você deseja adicionar este diretório ao caminho de pesquisa do seu shell, use:

export PATH="${PATH}:$(python3 -c 'import site; print(site.USER_BASE)')/bin"
rgov
fonte
14

Apenas um aviso:

De acordo com esse problema , --useratualmente não é válido dentro de um ambiente virtual pip, pois a localização do usuário não faz muito sentido para um ambiente virtual.

Portanto, não use pip install --user some_pkg dentro de um ambiente virtual , caso contrário, os ambientes virtuais pipserão confusos. Veja esta resposta para mais detalhes.

YaOzI
fonte
11

A melhor maneira é instalar virtualenve não exigir a --userconfusão. Você terá mais flexibilidade e não se preocupará em adotar as diferentes versões e projetos do python toda vez que instalar um pacote.

https://virtualenv.pypa.io/en/stable/

user603749
fonte
8

No macOS, o motivo para usar o --usersinalizador é garantir que não corrompamos as bibliotecas nas quais o sistema operacional se baseia. Uma abordagem conservadora para muitos usuários do macOS é evitar instalar ou atualizar o pip com um comando que exija sudo. Portanto, isso inclui a instalação no/usr/local/bin ...

Ref: Instalando python para Neovim ( https://github.com/zchee/deoplete-jedi/wiki/Setting-up-Python-for-Neovim )

Não sei ao certo por que a instalação no /usr/local/binarrisca em um Mac, considerando que o sistema depende apenas de binários python em /Library/Frameworks/e /usr/bin. Eu suspeito que é porque, como mencionado acima, a instalação no /usr/local/binrequer o sudoque abre a porta para cometer um erro caro com as bibliotecas do sistema. Assim, a instalação ~/.local/biné uma maneira segura de evitar esse risco.

Ref: Usando python em um Mac ( https://docs.python.org/2/using/mac.html )

Finalmente, na medida em que há um benefício em instalar pacotes no /usr/local/bin, pergunto-me se faz sentido alterar o proprietário do diretório de rootpara user? Isso evitaria ter que usar sudoenquanto ainda protegia contra fazer alterações dependentes do sistema. * Esse padrão de segurança é uma relíquia de como os sistemas Unix foram usados ​​com mais frequência no passado (como servidores)? Ou, no mínimo, apenas uma boa maneira de os usuários de Mac não hospedarem um servidor?

* Nota: O recurso System Integrity Protection (SIP) do Mac também parece proteger o usuário de alterar as bibliotecas dependentes do sistema.

- E

Eco de Edmund
fonte
8

Sem ambientes virtuais

pip <command> --user altera o escopo do comando pip atual para trabalhar no local de instalação do pacote python local da conta de usuário atual, em vez do local de instalação do pacote em todo o sistema, que é o padrão.

Isso realmente importa apenas em uma máquina multiusuário. Qualquer coisa instalada no local do sistema ficará visível para todos os usuários; portanto, a instalação no local do usuário manterá a instalação do pacote separada dos outros usuários (eles não o verão e precisariam instalá-lo separadamente para usá-lo). Como pode haver conflitos de versão, a instalação de um pacote com dependências necessárias para outros pacotes pode causar problemas; portanto, é melhor não enviar todos os pacotes que um determinado usuário usa para o local de instalação do sistema.

  • Se for uma máquina de usuário único, há pouca ou nenhuma diferença na instalação no --userlocal. Ele será instalado em uma pasta diferente, que pode ou não precisar ser adicionada ao caminho, dependendo do pacote e de como é usado (muitos pacotes instalam ferramentas de linha de comando que devem estar no caminho para executar a partir de um shell) .
  • Se for uma máquina multiusuário, --useré preferível usar root / sudo ou exigir a instalação do administrador e afetar o ambiente Python de cada usuário, exceto nos casos de pacotes gerais que o administrador deseja disponibilizar a todos os usuários por padrão.
    • Nota: Por comentários, na maioria das instalações Unix / Linux, foi apontado que as instalações do sistema devem usar o gerenciador de pacotes geral, como apt, em vez de pip.

Com ambientes virtuais

A --useropção em um ambiente venv / virtualenv ativo será instalada no local python do usuário local (o mesmo que sem um ambiente virtual).

Os pacotes são instalados no ambiente virtual por padrão, mas se você --usero forçar a instalar fora dos ambientes virtuais, no diretório de scripts python dos usuários (no Windows, atualmente é c:\users\<username>\appdata\roaming\python\python37\scriptspara mim com o Python 3.7).

No entanto, você não poderá acessar uma instalação do sistema ou do usuário de dentro do ambiente virtual (mesmo que você tenha usado --userem um ambiente virtual).

Se você instalar um ambiente virtual com o --system-site-packagesargumento, terá acesso à pasta de scripts do sistema para python. Eu acredito que isso incluiu a pasta de script python do usuário também, mas não tenho certeza. No entanto, pode haver consequências indesejadas para isso e não é a maneira pretendida de usar ambientes virtuais.


Localização do sistema Python e das pastas de instalação do usuário local

Você pode encontrar o local da pasta de instalação do usuário para python com python -m site --user-base. Estou encontrando informações conflitantes nas perguntas e respostas, na documentação e, na verdade, usando este comando no meu PC para saber quais são os padrões, mas eles estão sob o diretório inicial do usuário ( ~atalho em * nix e, c:\users\<username>normalmente, no Windows).


Outros detalhes

A --useropção não é válida para todos os comandos. Por exemplo pip uninstall, encontrará e desinstalará os pacotes onde quer que estejam instalados (na pasta do usuário, na pasta do ambiente virtual etc.) e a --useropção não é válida.

Os itens instalados pip install --userserão instalados em um local local que será visto apenas pela conta de usuário atual e não exigirá acesso root (no * nix) ou acesso de administrador (no Windows).

A --useropção modifica todos os pip comandos que o aceitam para ver / operar na pasta de instalação do usuário, portanto, se você usá- pip list --userlo, apenas mostrará os pacotes instalados pip install --user.

LightCC
fonte
1
Você consideraria reformular a primeira parte? Fora de um ambiente virtual Python, é realmente melhor evitar o uso pip installsem o --userinteiramente. Isso instalaria pacotes Python em lugares que realmente deveriam ser deixados para o gerenciador de pacotes do sistema (por exemplo, aptno Debian / Ubuntu). É melhor não mexer com isso, isso leva a muitos problemas. Se um pacote Python precisar estar disponível para todos os usuários, use o gerenciador de pacotes do sistema operacional, mas não o faça sudo pip install .... Uma alternativa é sudo pip install --target .... No Windows, é menos um problema.
sinoroc
Ok - você quer dizer a segunda metade do marcador final na seção "sem ambientes virtuais"? Se não, quais partes específicas? (sinta-se livre para editá-lo diretamente para esta atualização, eu não sou principalmente um usuário * nix)
LightCC
Entendo, se você não usa o Windows, é muito menos preocupante, pois ele realmente não possui um gerenciador de pacotes centralizado, a menos que você comece a usar algo como nuget . Vou ver se volto para editar sua resposta.
30619 sinoroc
@sinoroc Adicionei uma nota a esse parágrafo. Sinta-se à vontade para atualizá-lo para ser mais preciso etc. ou editar em outro lugar, se eu tiver um texto semelhante.
LightCC
1

Por que não colocar um executável em algum lugar do meu $ PATH

~/.local/bin directoryé teoricamente esperado que você esteja no seu $PATH.

De acordo com essas pessoas , é um erro não adicioná-lo $PATHao usar systemd.

Esta resposta explica mais amplamente.

Mas mesmo se a sua distro inclui o ~/.local/bindiretório ao$PATH , pode ser na forma seguinte (dentro ~/.profile):

if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

o que exigiria o logout e o login novamente , se o diretório não estivesse lá antes.

Jannis Ioannou
fonte