¿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__.pyarchivo.from plumbum.cmd import lsimplementación__init__.pyRespuestas:
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__.pyarchivo. 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
.pyextensió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__.pyarchivo 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__.pyarchivo.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__.pyarchivo de ese paquete son directamente visibles, no subpaquetes o módulos. Como ejemplo, considere elxmlpaquete en la biblioteca estándar de Python: suxmldirectorio contiene un__init__.pyarchivo y cuatro subdirectorios; el subdirectorioetreecontiene un__init__.pyarchivo y, entre otros, unElementTree.pyarchivo. 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 eranmodules.importdeclaració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 simpleimportdeclaración. En cuanto al código,import my-filees lo mismoimport my - fileque 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.pyun "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.pathy otras configuraciones. Esto es exactamente lo que sucede conpython -m my.moduleseguido de unimport my.moduleen 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
aya.bpaquetes (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.cno es un paquete. Podemos demostrar esto agregando otro archivoa/b.pya 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.pyes 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.cporquea.bno es un paquete y, por lo tanto, no puede tener submódulos.También puede ver aquí que el módulo de paquete
atiene un__path__atributo (los paquetes deben tener esto) pero el módulo sin paquetea.bno.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__.pymó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érminopackageconfusos, y he hablado con algunos principiantes de Python que lo encuentran completamente desconcertante.