¿Cuál es la diferencia entre un módulo Python y un paquete Python?
Consulte también: ¿Cuál es la diferencia entre "paquete" y "módulo" (para otros idiomas)
¿Cuál es la diferencia entre un módulo Python y un paquete Python?
Consulte también: ¿Cuál es la diferencia entre "paquete" y "módulo" (para otros idiomas)
__init__.py
archivo.from plumbum.cmd import ls
implementación__init__.py
Respuestas:
Un módulo es un único archivo (o archivos) que se importan bajo una importación y se usan. p.ej
Un paquete es una colección de módulos en directorios que dan una jerarquía de paquetes.
Documentación para módulos
Introducción a paquetes
fuente
__path__
atributo.__init__.py
archivo. Son módulos que pueden contener otros módulos.__path__
atributo.Cualquier archivo Python es un módulo , cuyo nombre es el nombre base del archivo sin la
.py
extensión. Un paquete es una colección de módulos de Python: mientras que un módulo es un solo archivo de Python, un paquete es un directorio de módulos de Python que contiene un__init__.py
archivo adicional , para distinguir un paquete de un directorio que simplemente contiene un montón de scripts de Python. Los paquetes se pueden anidar a cualquier profundidad, siempre que los directorios correspondientes contengan su propio__init__.py
archivo.La distinción entre módulo y paquete parece mantenerse solo en el nivel del sistema de archivos. Cuando importa un módulo o un paquete, el objeto correspondiente creado por Python siempre es de tipo
module
. Sin embargo, tenga en cuenta que cuando importa un paquete, solo las variables / funciones / clases en el__init__.py
archivo de ese paquete son directamente visibles, no subpaquetes o módulos. Como ejemplo, considere elxml
paquete en la biblioteca estándar de Python: suxml
directorio contiene un__init__.py
archivo y cuatro subdirectorios; el subdirectorioetree
contiene un__init__.py
archivo y, entre otros, unElementTree.py
archivo. Vea lo que sucede cuando intenta importar paquetes / módulos de forma interactiva:En Python también hay módulos incorporados, como
sys
, que están escritos en C, pero no creo que quisieras considerarlos en tu pregunta.fuente
module
. Estoy en el proceso de escribir un depurador y me preocupaba que mi depurador fuera incorrecto al decir que mis paquetes eranmodule
s.import
declaración habitual , porque los guiones no están permitidos en los identificadores de Python. Usar en suimportlib.import_module()
lugar.Del glosario de Python :
Los archivos Python con un guión en el nombre, como
my-file.py
, no pueden importarse con una simpleimport
declaración. En cuanto al código,import my-file
es lo mismoimport my - file
que generará una excepción. Dichos archivos se caracterizan mejor como scripts, mientras que los archivos importables son módulos .fuente
Primero, tenga en cuenta que, en su definición precisa, un módulo es un objeto en la memoria de un intérprete de Python, a menudo creado al leer uno o más archivos del disco. Si bien podemos llamar informalmente un archivo de disco como
a/b/c.py
un "módulo", en realidad no se convierte en uno hasta que se combina con información de varias otras fuentes (comosys.path
) para crear el objeto del módulo.(Tenga en cuenta, por ejemplo, que se pueden cargar dos módulos con nombres diferentes desde el mismo archivo, dependiendo de
sys.path
y otras configuraciones. Esto es exactamente lo que sucede conpython -m my.module
seguido de unimport my.module
en el intérprete; habrá dos objetos de módulo__main__
ymy.module
, ambos creados) del mismo archivo en el disco,.my/module.py
)Un paquete es un módulo que puede tener submódulos (incluidos los subpaquetes). No todos los módulos pueden hacer esto. Como ejemplo, cree una pequeña jerarquía de módulos:
Asegúrese de que no haya otros archivos debajo
a
. Inicie un intérprete Python 3.4 o posterior (por ejemplo, conpython3 -i
) y examine los resultados de las siguientes afirmaciones:Módulos
a
ya.b
paquetes (de hecho, cierto tipo de paquete llamado "paquete de espacio de nombres", aunque no nos preocuparemos por eso aquí). Sin embargo, el móduloa.b.c
no es un paquete. Podemos demostrar esto agregando otro archivoa/b.py
a la estructura de directorios anterior e iniciando un nuevo intérprete:Python asegura que todos los módulos principales se carguen antes de cargar un módulo secundario. Arriba encuentra que
a/
es un directorio y, por lo tanto, crea un paquete de espacio de nombresa
, y quea/b.py
es un archivo fuente de Python que carga y usa para crear un módulo (sin paquete)a.b
. En este punto, no puede tener un móduloa.b.c
porquea.b
no es un paquete y, por lo tanto, no puede tener submódulos.También puede ver aquí que el módulo de paquete
a
tiene un__path__
atributo (los paquetes deben tener esto) pero el módulo sin paquetea.b
no.fuente
Una respuesta tardía, otra definición más:
Entonces, físicamente un paquete es una unidad de distribución, que proporciona uno o más módulos.
fuente
__init__.py
módulo dentro, pero si habla de unidades de distribución (comúnmente a través de PyPI), este es otro tipo de paquete completo (generalmente definido por la existencia desetup.py
). Encuentro estos dos usos del términopackage
confusos, y he hablado con algunos principiantes de Python que lo encuentran completamente desconcertante.