OSX El Capitan: sudo pip install OSError: [Erro: 1] Operação não permitida

127

Quando eu corro:

sudo pip install ipython

Estou tendo o erro a seguir

OSError: [Erro: 1] Operação não permitida: '/System/Library/Frameworks/Python.framework/Versions/2.7/share'

O último comando executado tenta criar o diretório fornecido acima.

Além disso, o comando a seguir falha ao instalar o iPython sem fornecer erros.

sudo pip install --user python

(Estou no Mac OS X El Capitan, caso outras pessoas neste sistema operacional vejam o mesmo problema.)

Milad M
fonte
Eu adicionei uma resposta que explica como modificar o seu $PATHpara que você possa chamar os executáveis ​​dos pacotes --user instalados. stackoverflow.com/a/47102398/117471
de Bruno Bronosky
2
Você não deve usar sudocom --user. O que --userfaz é instalar em ~/Libraryvez de /LibraryVocê não precisa usar sudopara instalar lá. Mas depois que você instala sudo, os diretórios e arquivos são de propriedade de root. Então você tem que usar sudopara fazer qualquer outra coisa com eles. O que, por sua vez, exigirá que você use sudopara outras coisas para as quais não deve usá-lo. Mesmo um erro honesto pode passar de um erro a destruir dados.
BrunoBruno3

Respostas:

205

Instruções dizendo sudo pip installsão inerentemente erradas.

Se houver algum tutorial por aí que diga que você deve fazer sudo pip, registre um bug neste pacote. O autor está deseducando a comunidade Python, pois o tempo provou sudo pipser uma prática quebrada.

OSX El Capitan introduziu um mecanismo para evitar danificar os arquivos do sistema operacional . /System/Library/Frameworks/Python.framework/Versions/2.7/shareé um dos locais protegidos. Um usuário normal não tem motivos para colocar ou gravar arquivos nele . Isso ocorre porque o próprio sistema operacional depende desses arquivos e sudo pip, com toda a força fornecida acima, os substituirá incondicionalmente. Geralmente coisas ruins não aconteceriam, mas as chances estão aí. A Apple quer proteger seus usuários de SO para bloquear acidentalmente sua instalação.

Em vez disso, você precisa instalar um pacote Python, como IPython, localmente na pasta inicial do seu usuário . A maneira mais fácil é criar um ambiente virtual , ativá-lo e executar o pip no ambiente virtual.

Exemplo:

cd ~  # Go to home directory
virtualenv my-venv
source my-venv/bin/activate
pip install IPython

Mais informações

Alternativamente, um deve ser capaz de fazer pip install --user. Porém, novamente, nenhum sudo é necessário e você precisa configurar manualmente a PATHvariável de ambiente.

Mikko Ohtamaa
fonte
5
Se nenhum virtualenv for desejado e você quiser instalar globalmente (por exemplo, /Library/Python/2.7/site-packages) módulos, tente minha solução abaixo usando easy_install stackoverflow.com/a/33463702/3078330
smat88dd
3
Você tem uma citação para esta perspectiva de 'sudo pip' ser ruim ("como o tempo provou que o sudo pip é uma prática falida")? Eu não vejo nenhuma discussão sobre sudo nas citações que você fornece e o tutorial lista o primeiro passo para criar virtualenvs como 'pip install virtualenv', que parece criar uma dependência circular tentando seguir seus conselhos.
Von
1
@Von: pip install virtualenvnão é mais necessário para o Python 3.4+, pois eles vêm com o python -m venvequivalente de virtualenv interno . docs.python.org/3/library/venv.html
Mikko Ohtamaa
29
Com todo o respeito, isso não aborda a questão original. Estou tentando instalar o IPython e disponibilizá-lo globalmente (para todos os usuários da minha máquina), e nem um virtualenv nem pip install --user IPythonajudar com isso. Além disso, pip install --user IPythonfalha ao colocar o ipythoncomando no $PATH(pelo menos na minha máquina).
jpetazzo
3
Você me ensinou e também economizou meu tempo. Um grande obrigado. Parei de usar o sudo e tudo funcionou! Ótima resposta.
Parth Gupta
24

Eu tive os mesmos problemas, mas o uso easy_install "module"resolveu o problema para mim.

Não sei por que, mas o pip e o easy_install usam diferentes locais de instalação e o easy_install escolheu os locais certos.

Editar: sem verificar novamente, mas por causa dos comentários; parece que instalações diferentes (OSX e instaladas por brew) interferem entre si, e é por isso que as ferramentas mencionadas realmente apontam para locais diferentes (pois pertencem a instalações diferentes). Entendo que normalmente essas ferramentas de uma instalação apontam para a mesma pasta.

smat88dd
fonte
Você tem dois interpretadores Python diferentes instalados e easy_installestá configurado para outro?
precisa saber é o seguinte
Eu tenho 2-3 versões diferentes Python instalado, mas eu tenho easy_installpara todos eles: easy_install-2.6, easy_install-2.7,easy_install-3.5
smat88dd
Provavelmente pipe easy_installapontam para diferentes Python's. Você pode descobrir isso com o whichcomando UNIX e, em seguida, descobrir o pipcomando correto a ser usado.
Mikko Ohtamaa
1
Pode ser a instalação anterior do OSX antigo antes da atualização?
Mikko Ohtamaa 6/11/2015
1
pip e easy_install usam diferentes locais de instalação - não, eles usam exatamente os mesmos locais. Ele trabalhou por acidente como @MikkoOhtamaa estava tentando mostrar-lhe em seus comentários. Isso é claramente sem resposta.
Piotr Dobrogost
19

Você deve reinstalar o Python:

brew reinstall python

Para obter o brew, consulte a página inicial do brew .

david euler
fonte
Eu segundo. Eu corro, brew install pythonentão acho que pipjá está no lugar. Depois que pipinstalar trabalhou (i teve problemas semelhantes w / permissões e fiando pip em instalações)
travelingbones
15

pip install --ignore-installed six

Isso fará o trabalho, e você poderá tentar seu primeiro comando.

Via http://github.com/pypa/pip/issues/3165

Alireza Samar
fonte
No meu caso, eu também tive que fazer pip install --ignore-installed setuptools.
Ithos67
2
Não, isso não fará o trabalho devido à falta de permissões.
Piotr Dobrogost
11

Usado em pip3 install <package>vez disso e resolveu o problema de permissão com pip.

Keng
fonte
10
Para sua informação, isso funcionou porque pip3usa o Python 3, que geralmente é instalado pelo usuário. O Python 2 (2.7), por outro lado, é enviado com o macOS e é protegido como explica a resposta mais bem classificada.
Khanh Nguyen
10

Correção TL; DR $ PATH

  1. Use pip install --user package_namepara instalar um pacote que deve incluir executáveis ​​da CLI.
  2. Inicie um shell python e import package_name
  3. Descubra onde lib/python/...ocorre a saída e substitua tudo porbin
  4. É provável que seja $HOME/Library/Python/2.7/bin

Detalhes

Devido à nova proteção de integridade do sistema no macOS 10.11 El Capitan, você não pode mais sudo pip install . Não discutiremos os méritos disso aqui.

Outra resposta explica que você deve pip install --userqual está correto. Mas eles enviaram você para os becos dos fundos para descobrir o que fazer com o seu $PATHpara que você pudesse acessar os executáveis ​​instalados. Felizmente, já resolvi uma necessidade semelhante de uma pergunta não relacionada .

Aqui está uma transcrição de como eu resolvi o problema em um dos meus sistemas. Estou incluindo tudo isso, mais do que o $PATHque funcionou para mim, porque seu sistema pode ser diferente do meu. Esse processo deve funcionar para todos.

$ pip install --user jp
Collecting jp
  Downloading jp-0.2.4.tar.gz
Installing collected packages: jp
  Running setup.py install for jp ... done
Successfully installed jp-0.2.4

$ python -c 'import jp; print jp'
<module 'jp' from '/Users/bbronosky/Library/Python/2.7/lib/python/site-packages/jp/__init__.pyc'>

$ find /Users/bbronosky/Library/Python -type f -perm -100
/Users/bbronosky/Library/Python/2.7/bin/jp

$ which jp

$ echo -e '\n''export PATH=$HOME/Library/Python/2.7/bin:$PATH' >> ~/.bashrc

$ bash # starting a new bash process for demo, but you should open a new terminal

$ which jp
/Users/bbronosky/Library/Python/2.7/bin/jp

$ jp
usage: jp <expression> <filepath>
Bruno Bronosky
fonte
10

Mesmo erro

Installing collected packages: six, pyparsing, packaging, appdirs, setuptools
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/commands/install.py", line 342, in run
    prefix=options.prefix_path,
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_set.py", line 784, in install
    **kwargs
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_install.py", line 851, in install
    self.move_wheel_files(self.source_dir, root=root, prefix=prefix)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_install.py", line 1064, in move_wheel_files
    isolated=self.isolated,
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/wheel.py", line 345, in move_wheel_files
    clobber(source, lib_dir, True)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/wheel.py", line 323, in clobber
    shutil.copyfile(srcfile, destfile)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 83, in copyfile
    with open(dst, 'wb') as fdst:
IOError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/six.py'

e aqui eu uso --usersem sudopara resolver esse problema

$ pip install --user scikit-image h5py keras pygame
Collecting scikit-image
  Downloading http://mirrors.aliyun.com/pypi/packages/65/69/27a1d55ce8f77c8ac757938707105b1070ff4f2ae47d2dc99461bfae4491/scikit_image-0.13.0-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (28.1MB)
    100% |████████████████████████████████| 28.1MB 380kB/s
Collecting h5py
  Downloading http://mirrors.aliyun.com/pypi/packages/b7/cc/1c29b0815b12de2c92b5323cad60f724ac8f0e39d0166d0b9dfacbcb70dd/h5py-2.7.0-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (4.5MB)
    100% |████████████████████████████████| 4.5MB 503kB/s
Requirement already satisfied: keras in /Library/Python/2.7/site-packages
Requirement already satisfied: pygame in /Library/Python/2.7/site-packages
Requirement already satisfied: matplotlib>=1.3.1 in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from scikit-image)
Requirement already satisfied: six>=1.7.3 in /Library/Python/2.7/site-packages (from scikit-image)
Requirement already satisfied: pillow>=2.1.0 in /Library/Python/2.7/site-packages (from scikit-image)
Requirement already satisfied: networkx>=1.8 in /Library/Python/2.7/site-packages (from scikit-image)
Requirement already satisfied: PyWavelets>=0.4.0 in /Library/Python/2.7/site-packages (from scikit-image)
Collecting scipy>=0.17.0 (from scikit-image)
  Downloading http://mirrors.aliyun.com/pypi/packages/72/eb/d398b9f63ee936575edc62520477d6c2353ed013bacd656bd0c8bc1d0fa7/scipy-0.19.0-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (16.2MB)
    100% |████████████████████████████████| 16.2MB 990kB/s
Requirement already satisfied: numpy>=1.7 in /Library/Python/2.7/site-packages (from h5py)
Requirement already satisfied: theano in /Library/Python/2.7/site-packages (from keras)
Requirement already satisfied: pyyaml in /Library/Python/2.7/site-packages (from keras)
Requirement already satisfied: python-dateutil in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: tornado in /Library/Python/2.7/site-packages (from matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: pyparsing>=1.5.6 in /Users/qiuwei/Library/Python/2.7/lib/python/site-packages (from matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: nose in /Library/Python/2.7/site-packages (from matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: olefile in /Library/Python/2.7/site-packages (from pillow>=2.1.0->scikit-image)
Requirement already satisfied: decorator>=3.4.0 in /Library/Python/2.7/site-packages (from networkx>=1.8->scikit-image)
Requirement already satisfied: singledispatch in /Library/Python/2.7/site-packages (from tornado->matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: certifi in /Library/Python/2.7/site-packages (from tornado->matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: backports_abc>=0.4 in /Library/Python/2.7/site-packages (from tornado->matplotlib>=1.3.1->scikit-image)
Installing collected packages: scipy, scikit-image, h5py
Successfully installed h5py-2.7.0 scikit-image-0.13.0 scipy-0.19.0 

Espero que ajude alguém que tenha problemas semelhantes!

Indo à minha maneira
fonte
3
Você não deve usar sudocom --user. O que --userfaz é instalar em ~/Libraryvez de /LibraryVocê não precisa usar sudopara instalar lá. Mas depois que você instala sudo, os diretórios e arquivos são de propriedade de root. Então você tem que usar sudopara fazer qualquer outra coisa com eles. O que, por sua vez, exigirá que você use sudopara outras coisas para as quais não deve usá-lo. Mesmo um erro honesto pode passar de um erro a destruir dados.
BrunoBruno3
9

Eu tive os mesmos problemas. Como outros já mencionaram, não execute o pip install com o sudo. Corre

brew doctor 

e corrija os avisos e você poderá continuar com a instalação do pip.

apadana
fonte
6

É difícil fazer o pip trabalhar no El Capitan por vários motivos:

  1. O OS X não define algumas variáveis ​​distutils corretamente, portanto, o pip tenta instalar arquivos auxiliares nos locais abaixo /System/Library/. O El Capitan bloqueia isso, que é o erro que você está enfrentando.
  2. O OS X inclui vários pacotes desatualizados em /System/Library/. O pip geralmente deseja atualizá-los, mas não pode fazê-lo no El Capitan.
  3. O OS X é /System/Library/mais alto na ordem de pesquisa em python do que /Library/Python/2.7/site-packages(o local do pacote em todo o sistema), portanto, mesmo se você conseguir instalar versões mais recentes de alguns pacotes, as antigas ainda serão carregadas, quebrando algumas dependências.

Existem soluções alternativas para tudo isso em https://apple.stackexchange.com/a/223163/143849 . Mas é melhor instalar sua própria versão do Python através do instalador padrão do Python, Homebrew ou Anaconda.

Matthias Fripp
fonte
4

Eu acho que você tem algum conflito com outro pacote. Para mim foi six. Então você precisa usar um comando como este:

pip install google-api-python-client --upgrade --ignore-installed six

ou

pip install --ignore-installed six

Ruhul Amin
fonte
3
Qual parte da resposta dada por @MikkoOhtamaa você não entende que ainda sugere o uso de sudo com pip ?
Piotr Dobrogost
@PiotrDobrogost, por que você não lê corretamente antes de perguntar. Minha resposta é relativa six.
Ruhul Amin
3
Novamente, qual parte da resposta dada por @MikkoOhtamaa você não entende que ainda sugere o uso de sudo com pip ?
Piotr Dobrogost
1

Concordo plenamente com Mikko, mas se você ainda quiser fazê-lo, aqui está o caminho:

  • Reinicie no modo de recuperação (mantenha pressionado cmd + R)
  • Terminal aberto a partir de utilitários
  • Use o comando csrutil disable
gilliM
fonte
6
Isso pode ser um conselho perigoso, sem explicar as implicações da desativação da Proteção da integridade do sistema. Uma consideração é a expectativa de que nunca mais funcionará corretamente se você não reativá-lo com relativa rapidez, como o Windows UAC e a Virtualização.
andy Magoon
0

Eu tenho o python2.7 instalado via brew e o seguinte resolveu meu problema

instalação de fermentação numpy

Ele instala o python3, mas ainda funciona e o configura para o 2.7 também.

Aerodyno
fonte
Trabalhou na perfeição. Obrigado!!
NightFury