É aceitável e seguro executar pip install no sudo?

114

Comecei a usar meu Mac para instalar pacotes Python da mesma forma que faço com meu PC com Windows no trabalho; no entanto, no meu Mac eu encontrei erros frequentes de permissão negada ao gravar em arquivos de log ou pacotes de sites.

Portanto, pensei em executar pip install <package>em, sudomas isso é um uso seguro / aceitável do sudo, considerando que estou apenas querendo que ele seja instalado na minha conta de usuário atual?

Exemplo de traceback de um erro de E / S do arquivo de log:

Command /usr/bin/python -c "import setuptools;__file__='/Users/markwalker/build/pycrypto/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --single-version-externally-managed --record /var/folders/tq/hy1fz_4j27v6rstzzw4vymnr0000gp/T/pip-k6f2FU-record/install-record.txt failed with error code 1 in /Users/markwalker/build/pycrypto
Storing complete log in /Users/markwalker/Library/Logs/pip.log
Traceback (most recent call last):
  File "/usr/local/bin/pip", line 8, in <module>
    load_entry_point('pip==1.1', 'console_scripts', 'pip')()
  File "/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg/pip/__init__.py", line 116, in main
    return command.main(args[1:], options)
  File "/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg/pip/basecommand.py", line 141, in main
    log_fp = open_logfile(log_fn, 'w')
  File "/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg/pip/basecommand.py", line 168, in open_logfile
    log_fp = open(filename, mode)
IOError: [Errno 13] Permission denied: '/Users/markwalker/Library/Logs/pip.log'

Atualizar Isso provavelmente se deve às permissões, mas a melhor abordagem é usar ambientes virtuais para seus projetos Python. A corrida sudo pipdeve ser evitada, a menos que seja absolutamente necessário.

markwalker_
fonte
12
Acho que ' cd /tmp; sudo pip install foo' é uma solução alternativa adequada.
Brian Cain
1
Possível duplicata de Quais são os riscos de executar 'sudo pip'?
pradyunsg
@pradyunsg, por que sinalizar uma pergunta tão antiga?
markwalker_
3
Em essência, a resposta aceita atualmente (e atualização na questão) sugere executar "sudo pip" - algo que os mantenedores de pip (eu sendo um deles) estão ativamente dizendo às pessoas para não fazerem, pois isso pode resultar na quebra de seu sistema operacional no MacOS e em muitas (todas?) principais distribuições de Linux. Aterrissei aqui usando termos que alguém que está depurando sua situação pode fazer e só queria que isso redirecionasse as pessoas para um local com melhores conselhos. Não pensei realmente em trazer essa questão e sua resposta está mais de acordo com a afirmação acima. (fora de caracteres)
pradyunsg
@markwalker_ você estaria disposto a remover esse conselho da questão e possivelmente substituí-lo por um conselho melhor (usando --user ou um virtualenv)?
pradyunsg

Respostas:

105

Use um ambiente virtual :

$ virtualenv myenv
.. some output ..
$ source myenv/bin/activate
(myenv) $ pip install what-i-want

Você só usa sudoou permissões elevadas quando deseja instalar coisas para a instalação global do Python em todo o sistema.

É melhor usar um ambiente virtual que isole os pacotes para você. Dessa forma, você pode brincar sem poluir a instalação global do python.

Como bônus, o virtualenv não precisa de permissões elevadas.

Burhan Khalid
fonte
2
Se suas permissões estão confusas para seu diretório inicial , usar o virtualenv provavelmente não o ajudará
hd1
1
Sim, vai, mas já aconteceu, então ele precisa consertar antes de continuar.
hd1 de
1
Obrigado pessoal, eu já li sobre o virtualenv antes, então espero que essas duas soluções juntas me
coloquem de
1
Além disso, para instalar o virtualenv você precisa fazer o sudo ... ou existe uma solução alternativa?
Jimijazz
8
Não entendo por que essa é a melhor resposta. A questão NÃO é sobre ambientes virtuais. É sobre a validade do uso sudo pip install. Digamos que eu precise instalar algum pacote que irei usar em muitos projetos ou no nível do sistema. Como alguma ferramenta CLI como pgcli. Obviamente, não preciso de um ambiente virtual para isso, quero instalá-lo globalmente. Devo usar sudo pip installou existem algumas práticas mais corretas? Essa é a questão.
Alex Belyaev
42

É aceitável e seguro correr por pip installbaixo sudo?

Não é seguro e está sendo mal visto - veja Quais são os riscos de executar o 'sudo pip'? Para instalar o pacote Python em seu diretório inicial, você não precisa de privilégios de root. Veja a descrição da --useropção de pip.

Piotr Dobrogost
fonte
Embora sua solução tenha sido a primeira que realmente funcionou, @throws_exceptions_at_you criou uma resposta com o código real e não um redirecionamento para a documentação
Edenshaw
Eu sudo pip installnão sabia dos danos de usá-lo. Como posso desfazer este comando ou bloquear a execução sudo?
Emre Değirmenci
26

Seu problema original é que o pip não pode gravar os logs na pasta.

IOError: [Errno 13] Permission denied: '/Users/markwalker/Library/Logs/pip.log'

Você precisa cd em uma pasta na qual o processo invocado pode escrever como /tmppara que um cd /tmpe re invocar o comando, provavelmente trabalho, mas não é o que você quer.

MAS, na verdade, para este caso específico (você não quer usar sudopara instalar pacotes Python) e não há necessidade de instalações de pacotes globais, você pode usar o --usersinalizador como este:

pip install --user <packagename>

e vai funcionar muito bem.

Presumo que você tenha uma instalação de python python de um usuário e não quer se preocupar em ler sobre o virtualenv (que não é muito amigável) ou pipenv .

Como algumas pessoas na seção de comentários apontaram, a próxima abordagem não é uma ideia muito boa, a menos que você não saiba o que fazer e tenha travado:

Outra abordagem para pacotes globais como no seu caso, você deseja fazer algo como:

chown -R $USER /Library/Python/2.7/site-packages/

ou mais geralmente

chown -R $USER <path to your global pip packages>
throws_exceptions_at_you
fonte
9
-1 Mudar a propriedade da pasta global de pacotes de sites é uma coisa terrível de se fazer. A --useropção de pip foi dada como uma solução na minha resposta que já existia quando você escreveu a sua.
Piotr Dobrogost
1
Eu não vejo um argumento aqui. Além disso, dado o fato de que alguém que faz essa pergunta de nível de entrada provavelmente não está familiarizado com o sistema de permissão do Unix e, portanto, executar uma instalação de 1 usuário não importa. Além disso, sua resposta na verdade falha em abordar o caso de uso de eu realmente QUERER instalar em pacotes globais. Depois de fazer isso, eu poderia facilmente reverter as permissões para pré-instalação.
throws_exceptions_at_you
2
1 para realmente escrever todos os comandos. Algumas pessoas presumem que o OP sabe como implementar uma opção na linha de comando, quando eles, ou outros leitores, não sabem . Você não concorda, @PiotrDobrogost?
Deixe-me pensar nisso
adicionar --userme ajuda!
Honghao Zhang
2
Alterar as permissões para todo o site-packagesdiretório do sistema Python é semelhante a "consertar" uma bomba batendo nela com uma chave inglesa. É protegido por uma razão - você não deve instalar nada lá . A solução real não é misturar a distribuição do sistema Python com a programação do dia-a-dia. Instale uma distribuição Python diferente (de Python.org, Homebrew, Canopy, etc.).
charlesreid1
9

Como tive o mesmo problema, quero enfatizar que, na verdade, o primeiro comentário de Brian Cain é a solução para o "IOError: [Errno 13]" - problema:

Se executado no diretório temporário ( cd /tmp), o IOError não ocorre mais se eu executar sudo pip install foo.

Edgar
fonte
2
Alguma chance de você explicar por que isso resolve o problema para você?
Chris
8
você ainda está usando sudo pipcom esta "solução" e, portanto, instalando pacotes com privilégios de root, o que provavelmente não é o que você deseja?
Chris
Só posso imaginar por que isso funciona: acho que alguma parte de (alguns) scripts de instalação do pip requerem acesso de gravação ao diretório atual, mas com um usuário diferente. Portanto, se executado enquanto estiver em seu diretório inicial, ele falhará misteriosamente devido à falta de acesso de gravação. Se chamado de dentro /tmp, funciona, porque todos têm acesso de gravação lá.
Edgar
Ele não tem acesso de gravação a '/Users/markwalker/Library/Logs/pip.log'
throws_exceptions_at_you
5

Tive um problema ao instalar virtualenvwrapperapós instalar com sucesso virtualenv.

Meu terminal reclamou depois que fiz isso:

pip install virtualenvwrapper

Então, eu tentei sem sucesso (NÃO RECOMENDADO) :

sudo pip install virtualenvwrapper

Então, eu instalei com sucesso com este:

pip install --user virtualenvwrapper
Deixe-me pensar sobre isso
fonte
A opção --user para pip foi fornecida como uma solução em minha resposta, que já existia quando você escreveu a sua. Isso deveria ser um comentário, não uma resposta.
Piotr Dobrogost
você diz NÃO recomendado, mas as notas de instalação oficiais dizem OK para instalar o virtualenvwrapper com sudo. O mesmo vale para o virtualenv. A pergunta feita aqui não faz referência a essas duas, então presumo que todas as outras respostas aqui sejam para pacotes gerais de python.
mehmet
Para futuros leitores, rompi meu sinalizador "não recomendado" em minha resposta devido ao comentário acima, mas ainda não o verifiquei. É por isso que ainda não excluí a bandeira.
Deixe-me pensar sobre isso
4

Parece que suas permissões estão confusas. Digite chown -R markwalker ~no Terminal e tente pipnovamente? Deixe-me saber se você está classificado.

hd1
fonte
Embora isso possa resolver o problema de permissões, não responde à pergunta.
Burhan Khalid
1
Resolver problemas que eu não sabia que tinha é um bônus! chownestá fornecendo Operation not permittedvários diretórios ocultos como .shsh& presumo que esteja trabalhando com arquivos que pode definir agora, mas verei o que acontece quando o prompt cli retornar.
markwalker_