falha na instalação do pip com: OSError: [Erro 13] Permissão negada no diretório

123

pip install -r requirements.txtfalha com a exceção abaixo OSError: [Errno 13] Permission denied: '/usr/local/lib/.... O que há de errado e como faço para corrigir isso? (Estou tentando configurar o Django )

Installing collected packages: amqp, anyjson, arrow, beautifulsoup4, billiard, boto, braintree, celery, cffi, cryptography, Django, django-bower, django-braces, django-celery, django-crispy-forms, django-debug-toolbar, django-disqus, django-embed-video, django-filter, django-merchant, django-pagination, django-payments, django-storages, django-vote, django-wysiwyg-redactor, easy-thumbnails, enum34, gnureadline, idna, ipaddress, ipython, kombu, mock, names, ndg-httpsclient, Pillow, pyasn1, pycparser, pycrypto, PyJWT, pyOpenSSL, python-dateutil, pytz, requests, six, sqlparse, stripe, suds-jurko
Cleaning up...
Exception:
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 122, in main
    status = self.run(options, args)
  File "/usr/lib/python2.7/dist-packages/pip/commands/install.py", line 283, in run
    requirement_set.install(install_options, global_options, root=options.root_path)
  File "/usr/lib/python2.7/dist-packages/pip/req.py", line 1436, in install
    requirement.install(install_options, global_options, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/pip/req.py", line 672, in install
    self.move_wheel_files(self.source_dir, root=root)
  File "/usr/lib/python2.7/dist-packages/pip/req.py", line 902, in move_wheel_files
    pycompile=self.pycompile,
  File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 206, in move_wheel_files
    clobber(source, lib_dir, True)
  File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 193, in clobber
    os.makedirs(destsubdir)
  File "/usr/lib/python2.7/os.py", line 157, in makedirs
    mkdir(name, mode)
OSError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/amqp-1.4.6.dist-info'
RunLoop
fonte
Relacionado (específico do macOS / homebrew) stackoverflow.com/questions/33004708/…
wim

Respostas:

76

Opção a) Crie uma virtualenv, ative-a e instale:

virtualenv .venv
source .venv/bin/activate
pip install -r requirements.txt

Opção b) Instale no seu homedir:

pip install --user -r requirements.txt

Minha recomendação usa a opção safe (a), para que os requisitos deste projeto não interfiram com os outros requisitos do projeto.

hectorcanto
fonte
2
Eu recebi um erro como esse sudo:pip: command not foundna minha instância do aws ec2 ao executar este comando. Por favor ajude.
user3768495
2
@ user3768495 Provavelmente, o pip não está instalado por padrão. Qual distro é o seu EC2? Além disso, o python2 pode não estar instalado; portanto, você instala o python2 ou usa o pip3. Tenha cuidado com isso embora.
Hectorcanto
33
Eu li isso não é recomendado em vários lugares agora. Parece que devemos advertir contra o uso sudo ao executar pip (ver resposta de Bert)
Justus Eapen
3
@JustusEapen: Não sei como me sinto sobre isso. Não acho que a resposta adequada à pergunta do OP seja um manual sobre higiene básica do computador, incluindo "não execute código obscuro com permissões de superusuário" e "escove os dentes regularmente". Acho que a resposta ideal deve indicar que os pacotes podem ser instalados por usuário ou em todo o sistema, e que a instalação em todo o sistema, como o OP desejava (existem razões perfeitamente cromulentas para isso), requer permissão de superusuário. A precaução contra a instalação de pacotes no caminho do sistema provavelmente é o trabalho de outra pessoa em outra questão SO.
Tobia Tesan
8
voto negativo por causa de sudoaconselhar. mesmo que funcione agora, isso lhe dará muitas dores de cabeça no futuro.
Gerald
318

Deveríamos realmente parar de aconselhar o uso de sudowith pip install. É melhor tentar primeiro pip install --user. Se isso falhar, dê uma olhada no post superior aqui .

O motivo pelo qual você não deve usar sudoé o seguinte:

Ao executar o pip sudo, você está executando um código Python arbitrário da Internet como usuário root, o que representa um grande risco à segurança. Se alguém colocar um projeto mal-intencionado no PyPI e você o instalar, você concederá a um invasor acesso root à sua máquina.

bert
fonte
5
Boa observação. Afinal, isso vale para todos sudo x install, para todos x(inclusive x = make).
Tobia Tesan
1
Isso também resolveu meu problema. O que a adição de --user faz?
Miles Johnson
1
A adição de @MilesJohnson --userinstala o pacote no diretório inicial, em vez da raiz. A instalação de algo neste local não requer privilégios extras.
24417 bert
1
Além disso, se você estiver em um servidor remoto atrás de um proxy, "sudo" impedirá que você obtenha os pacotes de repositórios da Internet e / ou repositórios git da rede do servidor remoto.
Ataxias
2
Todas as menções sudoforam removidas há um ano. Esta resposta está obsoleta - revise e atualize-a. Você também precisa mencionar as instalações e permissões por usuário versus todo o sistema. Não use sua resposta para criticar diretamente outras respostas, que tendem a se tornar obsoletas rapidamente.
smci 01/07/19
28

Você está tentando instalar um pacote no caminho do sistema sem ter permissão para fazê-lo.

  1. Em geral, você pode usar sudopara obter temporariamente permissões de superusuário sob sua responsabilidade , a fim de instalar o pacote no caminho do sistema:

     sudo pip install -r requirements.txt

    Saiba mais sudo aqui .

    Na verdade, essa é uma péssima idéia e não há um bom caso de uso para isso, consulte o comentário de @ wim.

  2. Se você não quiser fazer alterações em todo o sistema, poderá instalar o pacote no caminho por usuário usando o --usersinalizador

    Tudo o que precisamos é:

     pip install --user runloop requirements.txt
  3. Por fim, para um controle ainda mais refinado , você também pode usar um virtualenv , que pode ser a solução superior para um ambiente de desenvolvimento, especialmente se você estiver trabalhando em vários projetos e quiser acompanhar as dependências de cada um.

    Depois de ativar seu virtualenv com

    $ my-virtualenv/bin/activate

    o seguinte comando instalará o pacote dentro do virtualenv (e não no caminho do sistema):

    pip install -r requirements.txt

Tobia Tesan
fonte
4
Correndo pip com raiz vem com riscos de segurança
Nrzonline
A execução de qualquer coisa que execute código da Internet como raiz traz riscos de segurança.
Tobia Tesan
Essa é quase a melhor resposta, mas ainda precisa ser atualizada. a) Agora pyenv/pipenv, devemos mencioná-los, de preferência a virtualenv(ou conda-env) b) sudo considerado prejudicial e ver as outras respostas. Portanto, coloque a resposta baseada em env primeiro e o sudo por último, com um grande aviso.
smci 01/07/19
1
sudo pip install -r requirements.txtnunca está certo. O ambiente python do sistema pertence ao sistema, ponto final . Se você instalar mais coisas python para o sistema, fazê-lo com o gerenciador de pacotes única (por exemplo sudo yum install, apt-get, etc ...) desde que esses acordos de recompra deve ter versões seguras e compatíveis de bibliotecas vão.
Wim
1
@TobiaTesan O código antigo sudo make install, geralmente compilado + vinculado, não é realmente análogo a um, sudo pip installpois a instalação no sistema Python env pode invalidar dependências . Suponha que exista um serviço de sistema python-frobnicatorque dependa froblib(isso também estará no gerenciador de pacotes e fixado em uma versão compatível) e, em seguida, você sudo pip installalgum outro aplicativo ou lib que dependa de " froblib > 1.2". O Pip alegremente "atualizará" a versão do sistema froblibcom uma versão mais nova, que pode ser incompatível / não testada e quebrará o sistema.
wim
26

Apenas esclarecendo o que funcionou para mim depois de muita dor no linux (baseado no ubuntu) devido a erros de permissão negada e aproveitando a resposta de Bert acima, agora uso ...

$ pip install --user <package-name>

ou se estiver executando o pip em um arquivo de requisitos ...

$ pip install --user -r requirements.txt

e eles funcionam de maneira confiável para cada instalação de pip, incluindo a criação de ambientes virtuais.

No entanto, a solução mais limpa no meu mais experiência tem sido a de instalar python-virtualenve virtualenvwrappercom sudo apt-get installno nível do sistema.

Em ambientes virtuais, use pip installsem o --usersinalizador AND sem sudo. Muito mais limpo, seguro e fácil no geral.

Thom Ives
fonte
Recebo a mensagem "Não é possível executar uma instalação '--user'. Os pacotes de sites do usuário não são visíveis neste virtualenv." erro ao tentar usarpip install --user -r requirements.txt
Amir A. Shabani
@ AmirA.Shabani a resposta foi editada desde a sua pergunta. Agora ele diz "dentro de ambientes virtuais, use pip install sem o sinalizador --user AND sem sudo" #
Daishi
7

O usuário não tem permissão de gravação para alguns caminhos de instalação do Python. Você pode dar a permissão por:

sudo chown -R $USER /absolute/path/to/directory

Portanto, você deve dar permissão e tentar instalá-lo novamente, se você tiver novos caminhos, também deverá dar permissão:

sudo chown -R $USER /usr/local/lib/python2.7/
Mesut GUNES
fonte
2
Para python instalado com o brew, esta é a resposta certa, porque o brew mantém os pacotes como o usuário local (sem raiz).
Idbrii
9
mostrar o diretório / usr / local não é uma boa ideia. Não pertence ao usuário. Você deve ler sobre a estrutura de arquivos unix.
User8162
6
Os itens abaixo /usrnormalmente pertencem à raiz hoje em dia. Recursivamente chowning lá poderia estragar o seu sistema. EVITAR .
Wim
0

Se você precisar de permissões, não poderá usar 'pip' com 'sudo'. Você pode fazer um truque, para poder usar o 'sudo' e instalar o pacote. Basta colocar 'sudo python -m ...' na frente do seu comando pip.

sudo python -m pip install --user -r package_name
j35t3r
fonte
Parece bom para mim, mas você poderia adicionar alguma explicação.
pythonic833 8/07
-1

Então, eu recebi o mesmo erro exato por um motivo completamente diferente. Devido a um bug Homebrew + pip totalmente separado, mas conhecido , eu segui esta solução alternativa listada nos documentos de ajuda do Google Cloud, onde você cria um arquivo .pydistutils.cfg em seu diretório pessoal. Este arquivo possui uma configuração especial que você deve usar apenas para a instalação de determinadas bibliotecas. Eu deveria ter removido esse arquivo disutils.cfg depois de instalar os pacotes, mas esqueci de fazê-lo. Então a solução para mim foi realmente ...

rm ~/.pydistutils.cfg.

E então tudo funcionou normalmente. Obviamente, se você tiver alguma configuração nesse arquivo por um motivo real, não desejará apenas controlá-lo diretamente. Mas, caso alguém fizesse essa solução alternativa e se esquecesse de remover esse arquivo, isso funcionou para mim!

bwest87
fonte
-1

É devido problema de permissão,

sudo chown -R $USER /path to your python installed directory

padrão seria /usr/local/lib/python2.7/

ou tente,

pip install --user -r package_name

e então diga, pip install -r requirements.txtisso será instalado dentro do seu ambiente

não diga, sudo pip install -r requirements.txtisso é instalado no caminho arbitrário do python.

Mohideen bin Mohammed
fonte