Sumário
Existem três categorias gerais de módulos com as quais você está lidando:
- Os programas de suporte instalados para todos os usuários com o sistema de pacotes do SO. (Isso pode até incluir ferramentas e bibliotecas usadas pelas pessoas que programam em Python; veja abaixo.) Para isso, você usa os pacotes do SO onde é possível e
pip
instala nos diretórios do sistema quando necessário.
- Os programas de suporte instalados por um usuário específico apenas para uso próprio e também para certos aspectos do uso "diário" do Python como linguagem de script. Para isso, ela usa
pip --user
, talvez pyenv ou pythonz , e ferramentas e táticas semelhantes.
- Aqueles que dão suporte ao desenvolvimento e uso de um aplicativo específico. Para estes você usa
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 agora virtualenv
eu lido comigo mesmo. (Por exemplo, meu script de ativação padrão depende de qualquer coisa pip3
ou pip
esteja no caminho, mas baixa sua própria cópia virtualenv
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.