NOTA: Como o OP, estou usando o Ubuntu 16.04, o Python 2.7 e o Pip 8.1.1.
é normal que ao fazer uma instalação de usuário com o pip, os pacotes apt-get instalados não sejam detectados? É um bug conhecido?
Acabei de mergulhar no código do pip e descobri que o comando list
do pip filtra uma lista de pacotes fornecidos por pkg_resources.WorkingSet () , que por sua vez obtém suas entradas de sys.path
. O resultado é que pip --list
(sem opções) também listará os pacotes do sistema instalados pelo APT. Então, de certa forma, o pip os detecta. Isso, no entanto, não significa que o pip pode gerenciar esses pacotes, semelhante a como o APT, o RPM e outros sistemas de gerenciamento de pacotes não são interoperáveis.
O Pip não pode gerenciar pacotes DEB instalados com o APT, mesmo se eles estiverem relacionados ao Python, porque existem diferenças suficientes em relação a como cada gerenciador de pacotes trabalha para evitar isso; Eu não conheço todos eles, mas um que é confuso é que o pip é instalado globalmente em /usr/lib/pythonX.Y/site-packages
ou /usr/local/lib/pythonX.Y/dist-packages
(dependendo da versão) e localmente em ~/.local/lib/pythonX.Y/site-packages
, enquanto pacotes DEB são instalados globalmente em /usr/lib/pythonX.Y/dist-packages
.
Essa estranheza está relacionada a uma decisão de projeto por desenvolvedores da Debian para, precisamente, evitar conflitos entre pacotes fornecidos por eles e instalados usando seu sistema de pacotes e pacotes obtidos por outros meios ( esta resposta de estouro de pilha me apontou na direção certa).
Portanto, não, não é um bug que o pip permita que você instale pacotes para ~/.local/lib/pythonX.Y/site-packages
, mesmo que um pacote já esteja instalado em /usr/lib/pythonX.Y/dist-packages
.
Vamos ver com o seu exemplo do ipython. Eu também o instalei anteriormente com o APT:
Pacote DEB
$ dpkg --get-selections | grep ipython ipython install $ dpkg -s ipython | grep Version Version: 2.4.1-1 $ dpkg-query -L ipython (...) /usr/lib/python2.7/dist-packages (...) /usr/bin/ipython (...)
Pacote de Pip
$ pip show -f ipython (...) Name: ipython Version: 5.3.0 (...) Installer: pip (..) Location: /usr/local/lib/python2.7/dist-packages Files: ../../../bin/ipython
Observação: ../../../bin/ipython
acaba sendo /usr/local/bin/ipython
.
Como esperado, whereis
me fornece as duas instâncias do IPython:
$ whereis -b ipython
ipython: /usr/bin/ipython /usr/local/bin/ipython
E eu ainda posso conseguir um terceiro IPython em ~/.local
!
Ainda mais intrigante, quando executo o mesmo comando novamente, recebo o mesmo processo de instalação (apenas diferença: as rodas são armazenadas em cache). Em vez disso, eu esperaria que o pip me contasse que o ipython já está instalado.
Isso parece estranho de fato e eu ainda estou olhando para ele, mas aqui está o que eu observei até agora: quando um pacote já foi instalado pelo pip localmente, ele parece sempre instalar (ele sempre produziu "Instalado com sucesso { pacote} "), mas realmente parece apenas alterar os pacotes dist-info. Por exemplo, tentei instalar o lxml localmente (com pip install lxml
ou pip install --user lxml
) algumas vezes:
Compare o timestamp de:
myusr@myhost:~$ ls -al .local/lib/python2.7/site-packages | grep lxml drwxrwxr-x 5 myusr mygroup 4096 feb 20 15:01 lxml drwxrwxr-x 2 myusr mygroup 4096 feb 20 15:01 lxml-3.7.3.dist-info
(Isso é depois que eu instalei o lxml pela primeira vez.)
Com:
myusr@myhost:~$ ls -al .local/lib/python2.7/site-packages | grep lxml drwxrwxr-x 5 myusr mygroup 4096 feb 20 15:01 lxml drwxrwxr-x 2 myusr mygroup 4096 feb 20 15:03 lxml-3.7.3.dist-info
(Isto é depois da última "instalação" do lxml.)
No entanto, quando alguém tenta instalar um pacote globalmente, o pip faz mostrar uma mensagem:
Requirement already satisfied (use --upgrade to upgrade): ipython in /usr/local/lib/python2.7/dist-packages