Qual é a diferença entre um módulo Python e um pacote Python?
Veja também: Qual é a diferença entre "pacote" e "módulo" (para outros idiomas)
Qual é a diferença entre um módulo Python e um pacote Python?
Veja também: Qual é a diferença entre "pacote" e "módulo" (para outros idiomas)
__init__.py
arquivo.from plumbum.cmd import ls
implementação__init__.py
Respostas:
Um módulo é um único arquivo (ou arquivos) que são importados sob uma importação e usados. por exemplo
Um pacote é uma coleção de módulos em diretórios que fornecem uma hierarquia de pacotes.
Documentação para módulos
Introdução aos pacotes
fonte
__path__
atributo.__init__.py
arquivo. Eles são módulos que podem conter outros módulos.__path__
Qualquer arquivo Python é um módulo , cujo nome é o nome base do arquivo sem a
.py
extensão. Um pacote é uma coleção de módulos Python: enquanto um módulo é um único arquivo Python, um pacote é um diretório de módulos Python contendo um__init__.py
arquivo adicional , para distinguir um pacote de um diretório que por acaso contém vários scripts Python. Os pacotes podem ser aninhados em qualquer profundidade, desde que os diretórios correspondentes contenham seu próprio__init__.py
arquivo.A distinção entre módulo e pacote parece manter-se apenas no nível do sistema de arquivos. Quando você importa um módulo ou pacote, o objeto correspondente criado pelo Python é sempre do tipo
module
. Observe, no entanto, quando você importa um pacote, apenas variáveis / funções / classes no__init__.py
arquivo desse pacote são diretamente visíveis, não subpacotes ou módulos. Como exemplo, considere oxml
pacote na biblioteca padrão do Python: seuxml
diretório contém um__init__.py
arquivo e quatro subdiretórios; o subdiretórioetree
contém um__init__.py
arquivo e, entre outros, umElementTree.py
arquivo. Veja o que acontece quando você tenta importar interativamente pacotes / módulos:No Python, também existem módulos internos, como os
sys
escritos em C, mas acho que você não considerou os que estão em sua pergunta.fonte
module
. Estou escrevendo um depurador e estava preocupado que meu depurador estivesse incorreto ao dizer que meus pacotes erammodule
s.import
instrução usual , porque traços não são permitidos nos identificadores Python. Use emimportlib.import_module()
vez disso.No glossário Python :
Arquivos Python com um traço no nome, como
my-file.py
, não podem ser importados com umaimport
declaração simples . Em termos de código,import my-file
é o mesmoimport my - file
que gerará uma exceção. Esses arquivos são mais bem caracterizados como scripts, enquanto os arquivos importáveis são módulos .fonte
Primeiro, lembre-se de que, em sua definição precisa, um módulo é um objeto na memória de um intérprete Python, geralmente criado pela leitura de um ou mais arquivos do disco. Embora possamos informalmente chamar um arquivo de disco como
a/b/c.py
um "módulo", ele na verdade não se torna um até ser combinado com informações de várias outras fontes (comosys.path
) para criar o objeto do módulo.(Observe, por exemplo, que dois módulos com nomes diferentes podem ser carregados do mesmo arquivo, dependendo de
sys.path
e outras configurações. É exatamente o que acontece compython -m my.module
seguido por umimport my.module
no intérprete; haverá dois objetos de módulo__main__
emy.module
, ambos criados do mesmo arquivo no disco,my/module.py
,.)Um pacote é um módulo que pode ter submódulos (incluindo subpacotes). Nem todos os módulos podem fazer isso. Como exemplo, crie uma pequena hierarquia de módulos:
Verifique se não há outros arquivos abaixo
a
. Inicie um intérprete Python 3.4 ou posterior (por exemplo, compython3 -i
) e examine os resultados das seguintes instruções:Módulos
a
ea.b
pacotes (na verdade, um certo tipo de pacote chamado "pacote de espaço para nome", embora não nos preocupemos com isso aqui). No entanto, o móduloa.b.c
não é um pacote. Podemos demonstrar isso adicionando outro arquivoa/b.py
à estrutura de diretórios acima e iniciando um novo intérprete:O Python garante que todos os módulos pai sejam carregados antes que um módulo filho seja carregado. Acima, ele descobre que
a/
é um diretório e, portanto, cria um pacote de namespacea
, ea/b.py
é um arquivo de origem Python que ele carrega e usa para criar um módulo (sem pacote)a.b
. Neste ponto, você não pode ter um móduloa.b.c
porquea.b
não é um pacote e, portanto, não pode ter submódulos.Você também pode ver aqui que o módulo do pacote
a
tem um__path__
atributo (os pacotes devem ter isso), mas o módulo não-pacotea.b
não.fonte
Uma resposta tardia, mais uma definição:
Então, fisicamente, um pacote é uma unidade de distribuição, que fornece um ou mais módulos.
fonte
__init__.py
módulo, mas se você falar sobre unidades de distribuição (geralmente via PyPI), esse é outro tipo de pacote inteiramente (geralmente definido pela existência desetup.py
). Acho esses dois usos do termopackage
confusos e falei com alguns iniciantes em Python que o consideram totalmente desconcertante.