Pacote de distribuição vs. pacote de importação#
Alguns conceitos diferentes são comumente referidos pela palavra “pacote”. Esta página esclarece as diferenças entre dois significados distintos, mas relacionados no empacotamento do Python , “pacote de distribuição” e “pacote de importação”.
O que é um pacote de distribuição?#
Um pacote de distribuição é um software que você pode instalar. Na maioria das vezes, isso é sinônimo de “projeto”. Quando você digita pip install pkg
, ou quando você escreve dependencies = ["pkg"]
em seu pyproject.toml
, pkg
é o nome de um pacote de distribuição. Quando você pesquisa ou navega no PyPI, a fonte centralizada mais conhecida para instalar Python bibliotecas e ferramentas, o que você vê é uma lista de pacotes de distribuição. Alternativamente, o termo “pacote de distribuição” pode ser usado para se referir a um arquivo específico que contém uma determinada versão de um projeto.
Note que no mundo Linux, um “pacote de distribuição”, mais comumente abreviado como “pacote de distro” (em inglês, distro package) ou apenas “pacote”, é algo fornecido pelo gerenciador de pacotes do sistema da “distribuição Linux <distro>`_, que é um significado diferente.
O que é um pacote de importação?#
Um pacote de importação é um módulo Python. Assim, quando você escreve import pkg
ou from pkg import func
em seu código Python, pkg
é o nome de um pacote de importação. Mais precisamente, os pacotes de importação são módulos especiais Python que podem conter submódulos. Por exemplo, o pacote numpy
contém módulos como numpy.linalg
e numpy.fft
. Normalmente, um pacote de importação é um diretório no sistema de arquivos, contendo módulos como arquivos .py
e subpacotes como subdiretórios.
Você pode usar um pacote de importação assim que tiver instalado um pacote de distribuição que o fornece.
Quais são as conexões entre pacotes de distribuição e pacotes de importação?#
Na maioria das vezes, um pacote de distribuição fornece um único pacote de importação (ou módulo de não embalagem), com um nome correspondente. Por exemplo, pip install numpy
permite que você importe usando import numpy
.
No entanto, esta é apenas uma convenção. PyPI e outros índices de pacotes não impõe nenhuma relação entre o nome de um pacote de distribuição e os pacotes de importação que ele fornece. (Uma consequência disso é que você não pode instalar cegamente o pacote PyPI foo
se você vir import foo
; isso pode instalar um pacote não intencional, e potencialmente até mesmo malicioso.)
Um pacote de distribuição pode fornecer um pacote de importação com um nome diferente. Um exemplo disso é a popular biblioteca Pillow para processamento de imagens. Seu nome do pacote de distribuição é Pillow
, mas fornece o pacote de importação PIL
. Isto é por razões históricas: Pillow começou como um fork da biblioteca PIL, assim manteve o nome de importação PIL
para que os usuários PIL existentes pudessem mudar para o Pillow com pouco esforço. Mais geralmente, um fork de uma biblioteca existente é uma razão comum para diferentes nomes entre o pacote de distribuição e o pacote de importação.
Em um determinado índice de pacotes (como PyPI), nomes de pacotes de distribuição devem ser únicos. Por outro lado, os pacotes de importação não têm tal exigência. Os pacotes de importação com o mesmo nome podem ser fornecidos por vários pacotes de distribuição. Novamente, forks são uma razão comum para isso.
Por outro lado, um pacote de distribuição pode fornecer vários pacotes de importação, embora isso seja menos comum. Um exemplo é o pacote de distribuição attrs, que fornece um pacote de importação attrs
com uma API mais recente, e um pacote de importação attr
com uma API mais antiga, mas suportada.
Qual a comparação de nomes de pacotes de distribuição e de nomes de pacotes de importação?#
Os pacotes de importação devem ter identificadores válidos do Python como seu nome (as regras exatas são encontradas na documentação do Python) [1]. Em particular, eles usam sublinhado _
como separador de palavras e eles são sensíveis a casos.
Por outro lado, os pacotes de distribuição podem usar hífenes -
ou sublinhados _
. Eles também podem conter pontos .
, que às vezes é usado para empacotar um subpacote de um pacote de espaço de nomes. Para a maioria dos fins, eles não diferenciam letras maiúsculas de minúsculas nem -
de _
. Por exemplo, pip install Awesome_Package
é o mesmo que pip install awesome-package
(as regras precisas são dadas na especificação de normalização de nome).