O pip substitui os pacotes instalados pelo apt-get?

9

O que acontece se eu acidentalmente pip installinstalar um pacote que já instalei usando apt-getanteriormente? Simplesmente utilizo a versão mais recente (ou seja, provavelmente a que instalei usando pip)? O que acontece ao contrário?

Nota: Eu não uso o Python em um ambiente virtual (simplesmente porque não sei por que deveria - uso o Python como uma ferramenta de análise de dados e, principalmente, tento usar a versão mais recente de tudo).

Fred S
fonte
Se não estou errado, você não instala os mesmos pacotes usando apt-getepip
Lucio
Corerct, pipinstala-os em /usr/localsubdiretórios por padrão ou em qualquer outro diretório, se desejar.
Timo
3
Mas o que acontece, por exemplo, se eu apt-get install python-pandasseguir primeiro pip install pandasou o contrário? Como minha instalação global do python sabe qual das duas versões usar?
Fred S
11
@FredS: Execute o seguinte comando no terminal, o Python procurará nessa ordem específica por um módulo:python -c "import sys; print sys.path"
Timo

Respostas:

3

Como o @Timo mencionado em seu comentário, python -c "import sys; print sys.path"fornecerá o caminho de carregamento do módulo Python para sua instalação do Python. Em uma instalação relativamente nova do 16.04, há três diretórios importantes (dentre os 10 que estavam no meu):

  • '' (diretório do aplicativo)
  • '/usr/local/lib/python2.7/dist-packages' (onde o pip instala os módulos)
  • '/usr/lib/python2.7/dist-packages' (onde o apt instala módulos)

O mais importante a observar, no entanto, é que '/usr/local/lib/python2.7/dist-packages' é MAIS ALTO em precedência do que '/usr/lib/python2.7/dist-packages'.

Se você primeiro instalar um pacote Python via apt (-get), ele será instalado em '/usr/lib/python2.7/dist-packages'. Se você tentar mais tarde usar o pip para instalar o módulo, o pip emitirá inicialmente um aviso de que a dependência já foi atendida e, em seguida, saia; adicionar o sinalizador --upgrade forçará a instalação do pip, instalando o módulo em '/usr/local/lib/python2.7/dist-packages'. (Observe a saída que também diz que a versão em '/usr/lib/python2.7/dist-packages' não é desinstalado) Você pode, então, verificar se a versão instalada-pip é o que está sendo usado por usando o seguinte: python -c "import MODULE; print MODULE.__file__".

Como tal, isso mostra que os pacotes instalados via pip terão precedência sobre os pacotes instalados pelo sistema, mas não substituirão nada instalado no apt (-get).

Bryan Wyatt
fonte
1

Para adicionar ao @Bryan Wyatt, parece desejável (e pretendido) que os itens instalados / atualizados pelo PIP tenham precedência sobre os pacotes instalados do APT (provavelmente mais antigos). Meu sistema teve os caminhos apt e pip revertidos. Deve ser (ignorando outras entradas):

  • '/usr/local/lib/python2.7/dist-packages' (onde o pip instala os módulos)
  • '/usr/lib/python2.7/dist-packages' (onde o apt instala módulos)

No entanto, devido a alguma ação desconhecida que devo ter tomado, esses caminhos apareceram na ordem oposta para mim (ignorando outras entradas):

  • '/usr/lib/python2.7/dist-packages' (onde o apt instala módulos)
  • '/usr/local/lib/python2.7/dist-packages' (onde o pip instala os módulos)

Acontece algo que eu tinha adicionado /usr/lib/python2.7/dist-packagesa /usr/local/lib/python2.7/dist-packages/easy-install.pth. Simplesmente remover a linha de easy-install.pthcorrigir os erros de ordem para mim. /usr/lib/python2.7/dist-packagesainda está no meu caminho, pois é adicionado posteriormente em outro lugar.

Como nota lateral, o pprint exibirá seu caminho melhor ... ou seja:

$ python -c "import sys; import pprint; pprint.pprint(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',
 '/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/gtk-2.0',
 '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
proxima
fonte