Esse problema geralmente ocorre quando o pip tenta instalar uma página de manual do IPython no El Capitan. A solução rápida é usar um comando pip como este:
sudo -H pip install --install-option '--install-data=/usr/local' <package>
No entanto, a Proteção de Integridade do Sistema (SIP) no El Capitan bloqueia várias práticas ruins com o pip que costumava passar, então você provavelmente precisará fazer mais algumas alterações para que o pip funcione sem problemas no El Capitan.
O SIP no El Capitan expõe três problemas com o uso do pip na versão do Python fornecida pela Apple no OS X:
O distutils não define duas variáveis importantes corretamente nos Macs; portanto, o pip tenta escrever cabeçalhos e outros arquivos compartilhados (por exemplo, páginas de manual) em /System/Library/Frameworks/Python.framework/Versions/2.7/
. Essa é uma péssima idéia, mas nas versões anteriores do OS X, ela teria êxito se o pip fosse executado com o sudo. No entanto, falha no El Capitan devido ao SIP. Este é o erro que você encontrou. Dá mensagens comoOSError: [Errno: 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/share'
A Apple instala versões desatualizadas de alguns pacotes no /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
(por exemplo, seis). Nas versões anteriores do OS X, quando você instalava um pacote que precisava de uma versão mais recente de um deles, sudo pip
removeva silenciosamente a versão antiga da /System/
pasta e instalava uma versão mais recente no /Library/Python/2.7/site-packages
. Essa também foi uma péssima idéia e não é mais possível com o SIP. Mas agora o pip trava com uma mensagem de erro ao tentar remover o pacote antigo. Essa mensagem também é OSError: [Errno: 1]
, mas vem depois de uma mensagem como Uninstalling six-1.4.1:
. Veja, por exemplo, https://github.com/pypa/pip/issues/3165 .
A versão Apple do Python adiciona vários diretórios /System/Library/Frameworks/Python.framework/Versions/2.7/
ao caminho de pesquisa do python acima dos locais padrão de instalação de pacotes acessíveis ao usuário. Portanto, se você instalar uma versão mais recente de um pacote em outro lugar (por exemplo, sudo -H pip install --ignore-installed six
), receberá uma mensagem informando que a instalação foi bem-sucedida, mas quando você executa o python, obtém a versão mais antiga /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
. Isso também impossibilita o uso de novos pacotes com o mesmo nome dos módulos da biblioteca padrão.
Você pode solucionar esses problemas, mas o método depende das suas respostas para três perguntas.
- Deseja continuar usando a versão do Python para Mac OS X ou instalar sua própria? Instalar o seu próprio é a opção mais segura e pode ser feito através do instalador oficial do Python, Homebrew ou Anaconda. É também o que a Apple recomenda , como apontado por @Sacrilicious . Se você instalar sua própria versão do Python, provavelmente deverá desinstalar qualquer coisa atualmente instalada
/Library/Python/2.7/site-packages
e os scripts que foram instalados /usr/local/bin
para esses pacotes (incluindo o pip). Caso contrário, você terá a experiência irritante de alguns scripts acessando a versão instalada do sistema do Python e alguns acessando sua própria instalação.
Se você deseja manter o Python instalado no sistema, precisará tomar mais duas decisões:
Deseja instalar pacotes para todos os usuários ou apenas para você? A instalação para todos os usuários garante que todos os programas que usam Python (incluindo possivelmente scripts administrativos) tenham acesso a todos os pacotes que você instala. No entanto, há uma chance distante de interferir no uso do Python pelo próprio El Capitan. (Espero que a Apple use python -S
para garantir que eles sempre obtenham os pacotes que esperam, mas não tenho como testar isso.) A instalação apenas para sua própria conta de usuário elimina a possibilidade de interferir na instalação do sistema em Python. Nota: se você pretende alternar da instalação em todo o sistema para somente o usuário, provavelmente deve aproveitar esta oportunidade para desinstalar qualquer coisa atualmente instalada nos /Library/Python/2.7/site-packages
scripts relacionados e em /usr/local/bin
.
Deseja ocultar os pacotes extras instalados com a versão OS X do Python (abaixo /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
) ou mantê-los no caminho de pesquisa? Eu recomendo escondê-los, para que as versões mais recentes desses pacotes sejam instaladas automaticamente em locais acessíveis pelo usuário, quando necessário. Se você não ocultar esse diretório, ocasionalmente receberá mensagens de que o pip não conseguiu remover um pacote existente para atualizá-lo para uma versão posterior (necessária para um pacote diferente que você está instalando). Nesse caso, você precisará executar pip install --ignore-installed <package>
, o que instalará a versão mais recente e ocultará a versão instalada pelo sistema. No entanto, se você esconder todo/System/.../Extras/...
diretório, você perderá o acesso a alguns pacotes da Apple que não estão disponíveis via pip, ou seja, CoreGraphics e bonjour. (Se você precisar deles, poderá obter acesso simbolizando-os no diretório de pacotes do site.)
Agora, aqui estão as soluções alternativas. Essas seriam boas práticas em todas as versões do OS X, para evitar a substituição ou remoção acidental de pacotes Python usados pelo sistema operacional; no entanto, são essenciais se você deseja usar pacotes instalados pelo usuário com a versão do Python fornecida pela Apple no OS X El Capitan (10.11).
Instalar pip
Você provavelmente já fez isso, mas, se não, pode usar o seguinte comando para instalar o pip para todos os usuários :
sudo -H easy_install pip
# pip script will be installed in /usr/local/bin
Ou use este comando para instalar o pip apenas para sua própria conta de usuário :
easy_install --user pip
# pip script will be installed in ~/Library/Python/2.7/bin
Gerenciar locais de arquivos compartilhados
Se você estiver instalando pacotes para todos os usuários, crie um arquivo chamado .pydistutils.cfg com estas linhas (em https://github.com/pypa/pip/issues/426 ):
[install]
install-data=/usr/local
install-headers=/usr/local
Se você costuma usar sudo -H pip ...
, deve colocar esse arquivo em /var/root
(diretório inicial do usuário root). Se você costuma usar sudo pip ...
, deve colocar esse arquivo em seu próprio diretório pessoal (~).
Essas configurações impedirão que o pip tente escrever itens compartilhados, como cabeçalhos e páginas de manual /Library/System
. (O comando na parte superior desta resposta é uma versão mais rápida da mesma coisa.) Essas configurações são necessárias porque o código específico do darwin /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/command/install.py
falha ao definir essas variáveis para locais graváveis na raiz (embora defina outras variáveis corretamente). Há mais informações sobre isso em https://github.com/pypa/pip/issues/3177 .
Se você instalar pacotes apenas para sua própria conta de usuário, os itens compartilhados serão instalados automaticamente em ~/Library/Python/2.7/
. Mas você deve adicionar as seguintes linhas ao seu perfil ~ /. Para que os itens compartilhados sejam encontrados quando você precisar deles:
export PATH=~/Library/Python/2.7/bin:$PATH
export MANPATH=~/Library/Python/2.7/share/man:$MANPATH
Nota: você precisará iniciar um novo shell ou executá-los na linha de comando para que as alterações entrem em vigor. Você também pode querer executar hash -r
se tiver removido recentemente scripts antigos do caminho.
Gerenciar caminho do Python
Você precisará garantir que os pacotes instalados sejam mais altos na ordem de pesquisa do Python do que os pacotes instalados pelo sistema. A maneira mais fácil de fazer isso é com .pth
arquivos. Isso segue a sugestão do @ Sacrilicious em outras partes desta página , mas garante que o diretório de pacotes de sites do usuário seja pesquisado antes do diretório de pacotes de sites em todo o sistema e que ambos sejam pesquisados antes da biblioteca padrão e do diretório Extras da Apple (ambos em / System /. ..) Ele também omite /System/.../Extras
o caminho de pesquisa, se desejado.
Crie um arquivo chamado fix_mac_path.pth
, com o texto abaixo. Se você estiver instalando pacotes para todos os usuários, fix_mac_path.pth
deve ser colocado no /Library/Python/2.7/site-packages
. Se você estiver instalando apenas para seu próprio usuário, fix_mac_path.pth
deve estar em ~ / Library / Python / 2.7 / lib / python / site-packages. (Esse arquivo pode ter o nome que você quiser, mas deve ser colocado em um ou nos dois locais e deve terminar com .pth
; além disso, todo o texto desse arquivo deve estar em uma linha.)
Se você deseja ocultar os pacotes instalados pela Apple em /System/.../Extras
:
Primeiro, execute um dos seguintes comandos para obter uma cópia de trabalho do pip / setuptools independente da versão fornecida pela Apple:
pip install --ignore-installed --user setuptools # your account only
# or
sudo -H pip install --ignore-installed setuptools # all users
Em seguida, coloque o seguinte código no fix_mac_path.pth
local especificado acima:
import sys; std_paths=[p for p in sys.path if p.startswith('/System/') and not '/Extras/' in p]; sys.path=[p for p in sys.path if not p.startswith('/System/')]+std_paths
Se você quiser continuar usando os pacotes instalados pela Apple, não precisará instalar outra cópia das ferramentas de instalação. Basta colocar o seguinte código no fix_mac_path.pth
local especificado acima:
import sys; std_paths=[p for p in sys.path if p.startswith('/System/')]; sys.path=[p for p in sys.path if not p.startswith('/System/')]+std_paths
Depois disso, você pode usar python -m site
para garantir que a ordem de pesquisa de caminho faça sentido.
Instalar pacotes
Depois disso, você poderá instalar novos pacotes usando um dos seguintes comandos.
Para todos os usuários:
sudo -H pip install <package>
Para seu próprio usuário:
pip install --user <package>