pip não sabe dos pacotes instalados do apt-get

1

Em um Ubuntu 16.04 bem fresco, estou instalando o ipython com pip, como uma instalação de usuário. O próprio Pip foi instalado a partir do pacote python-pip Ubuntu (8.1.1), assim como algumas dependências como pygments ou setuptools (20.7.0).

Minha pergunta: é 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?

Este é o comando que eu corro (como usuário, não como root):

$ pip install ipython

→ Eu recebo o download de muitos pacotes do PyPI, incluindo setuptool (27.3.0) e Pygments (2.1.3). Não acho que seja um problema de versão, já que o ipython requer apenas setuptools>=18.5 . Aliás, eu também recebo uma reclamação de que pip deve ser atualizado para a versão mais recente (8.1.2).

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.

Observe que não há dúvida de que o ipython (versão 5.1.0) está de fato instalado no diretório ~/.local e funciona bem (o único ajuste que precisei fazer foi adicionar ~/.local/bin à variável PATH em ~/.bashrc como mencionado em uma pergunta dedicada ).

Parece-me que algo está errado com a maneira como o pip detecta os pacotes apt-get instalados, mas não consigo descobrir o que. Estou faltando alguma coisa óbvia?

Se puder ajudar no diagnóstico, este é o caminho do módulo Python (modelica é o nome de usuário):

python -c "import sys; print sys.path"
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/home/modelica/.local/lib/python2.7/site-packages', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PILcompat', '/usr/lib/python2.7/dist-packages/omniORB/COS', '/usr/lib/python2.7/dist-packages/gtk-2.0']
    
por Pierre H. 23.09.2016 / 13:17

1 resposta

1

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

    
por Samuel Santana 21.02.2017 / 00:38