Pacotes Python são freqüentemente hospedados em muitos repositórios de distribuição. Depois de ler este tutorial, especificamente a seção intitulada "Deseja realmente fazer isso", evitei usar o pip e preferi usar o repositório do sistema, apenas recorrendo ao pip quando preciso instalar um pacote que não esteja no repositório.
No entanto, como esse é um método de instalação inconsistente, seria melhor usar apenas o pip? Quais são os benefícios / detratores do uso do pip no próprio repositório do sistema para pacotes disponíveis nos dois locais?
O link que eu incluí indica
A vantagem de sempre usar pacotes Debian / NeuroDebian padrão, é que os pacotes são cuidadosamente testados para serem compatíveis entre si. Os pacotes Debian registram dependências com outras bibliotecas, para que você sempre obtenha as bibliotecas necessárias como parte da instalação.
Eu uso arco. Este é o caso de outros sistemas de gerenciamento de pacotes além do apt?
pip
é o que acontece se você acidentalmente forpip uninstall
um pacote gerenciado por distribuição?pip
como usuário (em conjunto com um virtualenv) e, como tal, não tem permissão para mexer nos arquivos instalados pelo sistema.sudo pip
, talvez (embora mesmo assim, você esteja assumindo demais quando supõe que todo mundo usavirtualenv
), mas por exemplo eu uso o MSYS2 (Windows) onde isso simplesmente não se aplica. Eu tenho duas opções para instalar um pacote python:pacman
epip
. Eu tenho que ter em mente o que é usado para instalar o quê, porque usar o errado para desinstalar vai estragar tudo.TL; DR
pip
(+ virtualenv) para coisas (bibliotecas, estruturas, talvez ferramentas de desenvolvimento) que seus projetos (que você desenvolve) usamDependências de desenvolvimento
Se você estiver desenvolvendo software em Python, convém usar
pip
para todas as dependências do projeto, sejam elas dependências de tempo de execução, dependências em tempo de compilação ou outras coisas necessárias para testes e verificações de conformidade automáticas (linter, verificador de estilo, verificador de tipo estático) ...)Há várias razões para isso:
requirements.txt
(se o seu projeto for um aplicativo) ousetup.py
(se o seu projeto for uma biblioteca ou estrutura). Isso pode ser verificado no controle de revisão (por exemplo, Git) junto com o código-fonte, para que você sempre saiba qual versão do seu código se baseou em quais versões de suas dependências.Se você sentir que precisa separar dependências diretas e indiretas (ou distinguir entre o intervalo de versão aceitável para uma dependência e a versão real usada, consulte "version pinning"), procure nas ferramentas de pip e / ou pipenv. Isso também permitirá distinguir entre dependências de compilação e teste. (A distinção entre dependências de compilação e tempo de execução provavelmente pode ser codificada
setup.py
)Aplicativos que você usa
Para coisas que você usa como aplicação normal e que só acontece a ser escrito em Python, preferem gerenciador de pacotes do seu sistema operacional. Ele garantirá que esteja razoavelmente atualizado e compatível com outras coisas instaladas pelo gerenciador de pacotes. A maioria das distribuições Linux também afirma que não distribui nenhum malware.
Se algo que você precisa não está disponível no repositório de pacotes padrão da sua distribuição, você pode conferir repositórios de pacotes adicionais (por exemplo, barra de lançamento de distribuições baseadas em deb) ou usá-lo de
pip
qualquer maneira.--user
Nesse último caso, use para instalar na casa do usuário em vez de em todo o sistema, para que você tenha menos probabilidade de interromper a instalação do Python. (Para coisas que você precisa apenas temporariamente ou raramente, você pode até usar um virtualenv.)fonte
Outro motivo para acompanhar o gerenciador de pacotes é que as atualizações serão aplicadas automaticamente, o que é essencial para a segurança. Pense se o pacote de beans usado pelo Equifax foi atualizado automaticamente via yum-cron-security, o hack pode não ter acontecido.
Na minha caixa de desenvolvimento pessoal, eu uso Pip, em prod, uso pacotes.
fonte
Se estamos falando sobre a instalação de pacotes python para usar no código que você está escrevendo, use pip.
Para cada projeto em que você está trabalhando, crie um ambiente virtual e use apenas o pip para instalar as coisas que esse projeto precisa. Dessa forma, você instala todas as bibliotecas que você usa de maneira consistente, e elas estão contidas e não interferem em nada que você instala através do seu gerenciador de pacotes.
Se você planeja lançar qualquer código python, normalmente você adicionará um
setup.py
ourequirements.txt
ao seu projeto, o que permitirá ao pip obter automaticamente todas as suas dependências. Permitindo criar ou recriar facilmente um ambiente virtual para esse projeto.fonte
Sumário
Existem três categorias gerais de módulos com as quais você está lidando:
pip
instala nos diretórios do sistema quando necessário.pip --user
, talvez pyenv ou pythonz , e ferramentas e táticas semelhantes.virtualenv
(ou uma ferramenta similar).Cada nível aqui também pode estar recebendo suporte de um nível anterior. Por exemplo, nosso usuário em (2) pode confiar em um intérprete Python instalado via pacotes de SO.
Entrando nisso com mais detalhes:
Programas e pacotes do sistema
Os programas escritos em Python que você deseja "apenas executar" são fáceis: basta usar as ferramentas de instalação do SO e permitir que elas tragam o que precisam; isso não é diferente de um programa não-Python. É provável que isso traga ferramentas / bibliotecas Python (como o próprio interpretador Python!) Nas quais os usuários da sua máquina podem começar a confiar; isso não é um problema, desde que eles entendam a dependência e, idealmente, conheçam meios alternativos para lidar com isso em hosts que não fornecem essas dependências.
Um exemplo comum e simples dessa dependência são alguns dos meus scripts pessoais
~/.local/bin/
que começam com#!/usr/bin/env python
. Eles funcionarão bem (desde que executados no Python 2) no RH / CentOS 7 e na maioria das instalações (mas não todas) do Ubuntu; eles não estarão em uma instalação básica da Debian ou no Windows. Por mais que eu não goste de meu ambiente pessoal ter muitas dependências de pacotes de SO (eu trabalho em vários SOs diferentes), algo como isso acho bastante aceitável; meu plano de backup nos hosts raros que não têm um sistema Python e não conseguem um é usar um sistema de usuário, conforme descrito abaixo.Pessoas que usam um interpretador python do sistema também geralmente dependem do sistema
pip3
. É aí que eu costumo traçar a linha nas dependências do meu sistema; tudo a partir de agoravirtualenv
eu lido comigo mesmo. (Por exemplo, meu script de ativação padrão depende de qualquer coisapip3
oupip
esteja no caminho, mas baixa sua própria cópiavirtualenv
para inicializar o ambiente virtual que está criando.Dito isto, provavelmente há circunstâncias em que é perfeitamente razoável disponibilizar mais um ambiente de desenvolvimento. Você pode ter interfaces Python em pacotes complexos (como um DBMS) em que deseja usar a versão do sistema e acha melhor que também permita que o sistema escolha o código de biblioteca Python específico que você usará para conversar com ele. Ou você pode estar implantando muitos hosts com um ambiente de desenvolvimento básico para uma classe Python e acha mais fácil automatizar com pacotes de sistema padrão.
Programas e Pacotes "Diários do Usuário"
Os usuários podem ter bibliotecas ou programas Python que não se encaixam bem em um ambiente virtual porque, em primeiro lugar, desejam criar ambientes virtuais (por exemplo, virtualenvwrapper ) ou são coisas que você costuma usar na linha de comando, mesmo enquanto fazendo trabalho não-Python. Mesmo que eles tenham a capacidade de instalar versões do sistema, eles podem se sentir mais confortáveis em instalar os seus próprios (por exemplo, porque desejam usar a versão mais recente da ferramenta e suas dependências).
Geralmente
pip --user
é o que as pessoas usarão para isso, embora certas dependências, como o próprio interpretador Python, exijam um pouco mais do que isso. pyenv e pythonz são úteis para criar intérpretes pessoais (instalados~/.local/bin
para serem o intérprete padrão ou não) e, é claro, sempre é possível criar "manualmente" a partir da fonte, se as bibliotecas dev estiverem disponíveis.Eu tento manter o conjunto mínimo de coisas instaladas aqui: virtualenvwrapper (porque eu o uso constantemente) e talvez a versão mais recente do pip. Tento evitar dependências fora da biblioteca padrão ou no Python 3 para scripts pessoais que escrevo para serem usados em muitos hosts. (Embora veremos quanto tempo eu posso aguentar isso enquanto passo mais e mais desses scripts pessoais para o Python.)
Ambientes separados de desenvolvimento de aplicativos e tempo de execução
Esta é a coisa virtualenv usual. Para o desenvolvimento, você quase sempre deve usar um virtualenv para garantir que não esteja usando dependências do sistema ou, geralmente, mais de um para testar em diferentes versões do Python.
Esses ambientes virtuais também são bons para aplicativos com muitas dependências nas quais você deseja evitar poluir o ambiente do usuário. Por exemplo, costumo configurar um virtualenv para rodar notebooks Jupyter e similares.
fonte