apt-get instala python-xxx vs pip instala

7

Ainda estou tentando entender este problema que estou tendo e li uma tonelada de posts sobre sudo apt-get install python-XXX vs pip install , e eu entendo o jist dele (apt-get é um repositório de pacotes, gerenciado por grupos de pessoas completamente diferentes para pip, atualizações automáticas junto com tudo mais quando existe uma atualização disponível, é binária, etc). No entanto, existem algumas coisas que não compreendo e que não consegui encontrar respostas para:

  1. Se eu, por qualquer motivo, primeiro instalar um pacote, por exemplo numpy, com sudo apt-get install numpy e mais tarde pip install numpy . O que acontece? é numpy instalado novamente em outro lugar com versão diferente (por exemplo, em. local / lib), então agora eu tenho duas versões independentes? Qual deles é usado quando eu importo? (se eu entendi corretamente, ele é separado e o apt-get tem o sistema inteiro, mas eu vi respostas conflitantes a essa questão, por exemplo aqui )

  2. Eu notei que muitos dos pacotes no apt-get são bem antigos em comparação com o pip. por exemplo. no momento da escrita ipython 2.3.0 vs 4.0.3, numpy 1.10.2 vs 1.10.4, spyder 2.3.5 vs 2.3.8. Existe alguma vantagem para o primeiro sudo apt-get install seguido por um pip install ? ou isso é apenas estúpido?

  3. Percebi que meu pip era 1.5.6 - é o mais recente se você usar sudo apt-get install python-pip . enquanto no pip é 8.0.2! Eu acredito que isso está me causando problemas, porque com essa versão antiga você pode instalar o mesmo pacote várias vezes e ele não avisa. E de alguma forma, não escreve sobre o antigo. Eu percebi isso porque eu posso continuar a desinstalar o mesmo pacote (por exemplo, numpy) e ele ainda está lá quando eu faço pip show numpy . E curiosamente, sempre mostrando a mesma pasta (.local /), mas com versões diferentes: S Então eu tenho duas perguntas relacionadas a isso:

    a. Qual é a melhor maneira de instalar o pip? Atualmente estou inclinado para sudo apt-get install python-pip , pip install pip , sudo apt-get purge python-pip . Isso é sábio? Parece um pouco ridículo para mim.

    b. agora que eu sei que muitos dos meus pacotes estão bagunçados com instalações duplicadas, provavelmente porque alguns foram instalados com o apt-get e depois várias vezes com o pip 1.5.6, qual é a melhor maneira de verificar se há duplicatas e limpá-lo? Eu estou supondo que não é seguro usar um script para pip desinstalar todos e reinstalar?

P.S. Eu não tinha certeza se deveria postar isso como uma nova pergunta ou como uma resposta ao meu problema original. Uma vez que esta questão é muito mais concisa e geral, senti que seria melhor separar. Desculpas se eu estivesse enganado.

    
por memo 26.01.2016 / 14:57

1 resposta

7

Para os arquivos, depois de muita tentativa e erro, foi isso que eu encontrei (em retrospecto, alguns bits fazem sentido, outros são bastante confusos).

  • Se você sudo apt-get install python-xyz , o pacote irá aparecer em pip list . Claro que você pode importá-lo em python, mas não aparece em pip.get_installed_distributions (). (Obviamente o oposto é não verdadeiro. Ou seja, se você usar pip install xyz ele não aparecerá no seu apt / synaptic)

  • Depois de sudo apt-get install python-xyz , se você fizer pip install xyz , o que acontece depende da versão do pip que você tem.

OLD v1.5.6 (a versão atual enviada no Ubuntu PPA):

  • Esta versão do pip (1.5.6) apenas instalará uma nova cópia do xyz em um local diferente. Você acaba com várias cópias e isso causa uma enorme bagunça. por exemplo:

    • numpy do apt-get é 1.8.2 em /usr/local/lib/python2.7/dist-packages
    • numpy do pip é 1.10.4 em ~ / .local / lib / python2.7 / site-packages
  • Se eu fizer pip install numpy novamente, ele será baixado e instalado novamente. Então você pode acabar com muitas versões diferentes que você não pode realmente acessar. Eu posso fazer pip install numpy 5x vezes, e então eu posso fazer pip uninstall numpy 5x vezes! Obviamente, você pode prestar atenção para não fazer isso, mas às vezes os scripts de instalação de outros softwares são um pouco descuidados e podem atrapalhar as coisas. Inacreditável que o Ubuntu envie oficialmente esta versão do pip.

NOVA v8.0.2 (a versão atual no próprio pip):

  • versões mais recentes do pip (por exemplo, 8.0.2, que está no pip) se recusarão a instalar o mesmo pacote dizendo que o requisito já foi atendido. Então você não pode instalar uma nova versão. Esse é um bom comportamento (mais sobre como obter essa versão do pip mais tarde).

  • Nesse caso, você só pode atualizar, ou seja, instalar com o sinalizador -U.

  • No entanto, quando você tenta pip install -U xyz em um pacote instalado com o sudo apt-get, você receberá um erro de permissões porque o apt-get foi instalado em / usr / e você precisa de acesso root para gravar lá.

  • Portanto, o AFAIK não tem escolha a não ser sudo pip install -U xyz para poder atualizá-lo. Neste caso, o pip instala o pacote mais recente no mesmo local que o sudo apt-get o escreveu. por exemplo. no meu caso /usr/local/lib/python2.7/dist-packages. Isso é bom.

  • Também vale a pena ressaltar que os pacotes no apt são frequentemente bem mais antigos que os do pip (por exemplo: numpy v1.8.2 vs 1.10.4, scipy 0.14.1 vs 0.17.0, ipython 2.3 vs 4.0.3 , spyder 2.3.5 vs 2.3.8)

Então, meu pensamento atual é conseguir as grandes coisas com sudo apt-get , por exemplo sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy pytho n-nose spyder

e depois atualizá-los (ou pelo menos alguns deles) com sudo pip install -U .

NB Parece muito importante obter o novo pip do pip (muito meta)

sudo apt-get install python-pip
sudo pip install -U pip

P.S. Estou ciente do virtualenv, mas não tenho necessidade disso agora. Eu preciso apenas de um ambiente de desenvolvimento.

E aqui está um pequeno script para descarregar uma lista de pacotes, versão e caminho (mas só funciona em módulos instalados pip, não aqueles do apt-get)

import pip
pp = pip.get_installed_distributions()
for p in sorted([p.location+"\t"+p.project_name+" ("+p.version+")" for p in pp]):
    print p
    
por memo 26.01.2016 / 20:11