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)
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)
__init__.py
fichier.from plumbum.cmd import ls
implémentation__init__.py
Réponses:
Un module est un ou plusieurs fichiers qui sont importés sous une seule importation et utilisés. par exemple
Un package est une collection de modules dans des répertoires qui donnent une hiérarchie de package.
Documentation pour les modules
Introduction aux packages
la source
__path__
attribut.__init__.py
fichier. Ce sont des modules qui peuvent contenir d'autres modules.__path__
attribut.Tout fichier Python est un module , son nom étant le nom de base du fichier sans l'
.py
extension. Un package est une collection de modules Python: alors qu'un module est un fichier Python unique, un package est un répertoire de modules Python contenant un__init__.py
fichier supplémentaire , pour distinguer un package d'un répertoire qui se trouve juste contenir un tas de scripts Python. Les packages peuvent être imbriqués à n'importe quelle profondeur, à condition que les répertoires correspondants contiennent leur propre__init__.py
fichier.La distinction entre module et package semble se maintenir 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__init__.py
fichier de ce package sont directement visibles, pas les sous-packages ou modules. À titre d'exemple, considérons lexml
package dans la bibliothèque standard Python: sonxml
répertoire contient un__init__.py
fichier et quatre sous-répertoires; le sous-répertoireetree
contient un__init__.py
fichier et, entre autres, unElementTree.py
fichier. Voyez ce qui se passe lorsque vous essayez d'importer de manière interactive des packages / modules:En Python, il existe également des modules intégrés, tels que
sys
, qui sont écrits en C, mais je ne pense pas que vous vouliez les prendre en compte dans votre question.la source
module
. Je suis en train d'écrire un débogueur et je craignais que mon débogueur n'ait pas raison de dire que mes packages étaientmodule
s.import
instruction habituelle , car les tirets ne sont pas autorisés dans les identificateurs Python. Utilisezimportlib.import_module()
plutôt.Du glossaire Python :
Les fichiers Python avec un tiret dans le nom, comme
my-file.py
, ne peuvent pas être importés avec une simpleimport
instruction. Au niveau du code,import my-file
est le même que celuiimport my - file
qui déclenchera une exception. Ces fichiers sont mieux caractérisés comme des scripts alors que les fichiers importables sont des modules .la source
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 disque tel
a/b/c.py
qu'un "module", il ne le devient en réalité que lorsqu'il est combiné avec des informations provenant de plusieurs autres sources (telles quesys.path
) pour créer l'objet module.(Note, par exemple, que les deux modules avec des noms différents peuvent être chargés à partir du même fichier, en fonction
sys.path
et d' autres paramètres est exactement ce qui se passe avec.python -m my.module
Suivi d'unimport my.module
à l'interprète, il y aura deux objets de module,__main__
etmy.module
, à la fois créé 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 le faire. Par exemple, créez une petite hiérarchie de modules:
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, avecpython3 -i
) et examinez les résultats des instructions suivantes:Les modules
a
eta.b
sont des packages (en fait, un certain type de package appelé «package d'espace de noms», bien que nous ne nous en préoccupions pas ici). Cependant, le modulea.b.c
n'est pas un package. Nous pouvons le démontrer en ajoutant un autre fichiera/b.py
à la structure de répertoires ci-dessus et en démarrant un nouvel interpréteur:Python garantit que tous les modules parents sont chargés avant le chargement d'un module enfant. Au-dessus, il trouve qu'il
a/
s'agit d'un répertoire, et crée donc un package d'espace de nomsa
, et c'esta/b.py
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 modulea.b.c
car ila.b
ne s'agit pas d'un package et ne pouvez donc pas avoir de sous-modules.Vous pouvez également voir ici que le module de package
a
a un__path__
attribut (les packages doivent en avoir) mais pas le module non-packagea.b
.la source
Une réponse tardive, encore une autre définition:
Donc physiquement, un package est une unité de distribution, qui fournit un ou plusieurs modules.
la source
__init__.py
module à l'intérieur, mais si vous parlez d'unités de distribution (généralement via PyPI), il s'agit d'un autre type de package entièrement (généralement défini par l'existence desetup.py
). Je trouve ces deux utilisations du termepackage
déroutantes, et j'ai parlé à certains débutants en Python qui le trouvent complètement déroutant.