Quelle est la différence entre un module Python et un package Python?
Voir aussi: Quelle est la différence entre "package" et "module" (pour les autres langues)
Un module est un fichier unique (ou des fichiers) importés sous une importation et utilisés. par exemple.
import my_module
Un paquet est un ensemble de modules dans des répertoires qui donnent une hiérarchie de paquets.
from my_package.timing.danger.internets import function_of_love
Tout fichier Python est un module , son nom étant le nom de base du fichier sans l'extension .py
. Un package est une collection de Python modules: alors qu'un module est un seul fichier Python, un package est un répertoire de Python modules contenant un fichier __init__.py
supplémentaire, permettant de distinguer un paquet d'un répertoire contenant un tas de scripts Python. Les packages peuvent être imbriqués à n'importe quelle profondeur, à condition que les répertoires correspondants contiennent leur propre fichier __init__.py
.
La distinction entre module et package semble s’appliquer uniquement au niveau du système de fichiers. Lorsque vous importez un module ou un package, l'objet correspondant créé par Python est toujours de type module
. Notez, cependant, que lorsque vous importez un package, seules les variables/fonctions/classes du fichier __init__.py
de ce package sont directement visibles, et non . sous-packages ou modules. A titre d'exemple, considérons le package xml
dans la bibliothèque standard Python: son répertoire xml
contient un fichier __init__.py
et quatre sous-répertoires; le sous-répertoire etree
contient un fichier __init__.py
et, entre autres, un fichier ElementTree.py
. Voyez ce qui se passe lorsque vous essayez d'importer de manière interactive des packages/modules:
>>> import xml
>>> type(xml)
<type 'module'>
>>> xml.etree.ElementTree
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'etree'
>>> import xml.etree
>>> type(xml.etree)
<type 'module'>
>>> xml.etree.ElementTree
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'ElementTree'
>>> import xml.etree.ElementTree
>>> type(xml.etree.ElementTree)
<type 'module'>
>>> xml.etree.ElementTree.parse
<function parse at 0x00B135B0>
Dans Python, il existe également des modules intégrés, tels que sys
, écrits en C, mais je ne pense pas que vous souhaitiez les prendre en compte dans votre question.
Du glossaire Python :
Il est important de garder à l’esprit que tous les packages sont des modules, mais que tous les modules ne sont pas des packages. Autrement dit, les packages ne sont qu'un type de module particulier. Plus précisément, tout module contenant un attribut
__path__
est considéré comme un package.
Les fichiers Python avec un tiret dans le nom, comme my-file.py
, ne peuvent pas être importés avec une simple instruction import
. En termes de code, import my-file
est identique à import my - file
, ce qui déclenche une exception. Ces fichiers sont mieux caractérisés en tant que scripts tandis que les fichiers importables sont des modules .
Tout d'abord, gardez à l'esprit que, dans sa définition précise, un module est un objet dans la mémoire d'un interpréteur Python, souvent créé en lisant un ou plusieurs fichiers à partir du disque. Bien que nous puissions appeler de manière informelle un fichier de disque tel que a/b/c.py
un "module", il ne le devient réellement pas tant qu'il n'est pas combiné avec les informations de plusieurs autres sources (telles que sys.path
) pour créer l'objet de module. .
(Notez, par exemple, que deux modules avec des noms différents peuvent être chargés à partir du même fichier, en fonction de sys.path
et d'autres paramètres. C'est exactement ce qui se passe avec python -m my.module
suivi d'un import my.module
dans l'interprète, il y aura deux objets de module, __main__
et my.module
, tous deux créés à partir du même fichier sur le disque, my/module.py
.)
Un package est un module qui peut avoir des sous-modules (y compris des sous-packages). Tous les modules ne peuvent pas faire cela. Par exemple, créez une petite hiérarchie de modules:
$ mkdir -p a/b
$ touch a/b/c.py
Assurez-vous qu'il n'y a pas d'autres fichiers sous a
. Démarrez un interpréteur Python 3.4 ou version ultérieure (par exemple, avec python3 -i
) et examinez les résultats des instructions suivantes:
import a
a ⇒ <module 'a' (namespace)>
a.b ⇒ AttributeError: module 'a' has no attribute 'b'
import a.b.c
a.b ⇒ <module 'a.b' (namespace)>
a.b.c ⇒ <module 'a.b.c' from '/home/cjs/a/b/c.py'>
Les modules a
et a.b
sont des packages (en fait, un certain type de package appelé "paquet d'espace de nom", bien que nous ne nous en préoccupions pas ici). Cependant, le module a.b.c
n'est pas un paquet. Nous pouvons le démontrer en ajoutant un autre fichier, a/b.py
à la structure de répertoires ci-dessus et en démarrant un nouvel interpréteur:
import a.b.c
⇒ ImportError: No module named 'a.b.c'; 'a.b' is not a package
import a.b
a ⇒ <module 'a' (namespace)>
a.__path__ ⇒ _NamespacePath(['/.../a'])
a.b ⇒ <module 'a.b' from '/home/cjs/tmp/a/b.py'>
a.b.__path__ ⇒ AttributeError: 'module' object has no attribute '__path__'
Python garantit que tous les modules parents sont chargés avant un module enfant. Au-dessus, il trouve que a/
est un répertoire et crée ainsi un paquet d'espace de noms a
, et que a/b.py
est un fichier source Python qu'il charge et utilise pour créer. un module (non-package) a.b
. À ce stade, vous ne pouvez pas avoir de module a.b.c
car a.b
n'est pas un package et ne peut donc pas comporter de sous-modules.
Vous pouvez également voir ici que le module de package a
a un attribut __path__
(les packages doivent l'avoir) mais pas le module non-package a.b
.
Une réponse tardive, encore une autre définition:
Un paquet est représenté par une entité supérieure importée qui peut être un module autonome ou le module spécial
__init__.py
en tant qu'entité supérieure à partir d'un ensemble de modules dans une structure de sous-répertoires.
Donc physiquement, un paquet est une unité de distribution, qui fournit un ou plusieurs modules.