[wiki: Paquets]
Définition d’un paquet (package)

- Python appelle « paquet » tout répertoire contenant des fichiers python.
- On peut l’utiliser comme préfixe lors des importations :
#!python
>>> import pkg.mod2
>>> from pkg.mod2 import *
- Comme pour les fichiers, Python recherche les paquets au sein des répertoires listés dans sys.path.
- Les noms de packages, donc de répertoires, doivent respecter les règles de nommage des identificateurs python, donc pas d’espace ou de caractères exotiques, ou de syntaxe spécifique à tel ou tel système d’exploitation. Si on veut importer un fichier dont le chemin contient un espace, il faut que le répertoire correspondant soit intégré à sys.path.
#!html
<br clear=right>
!init!.py

- Tout package doit contenir un fichier !init!.py, exécuté lors de la première traversée de ce package.
- Pour chaque package, un objet de type module est créé en mémoire, qui recoit les variables et fonctions créées par l’!init!.py correspondant.
#!comment
La règle de l'init.py ne s'applique pas aux répertoires de base figurant dans sys.path.
ATTENTION au from…*
A Regarder : qu'est-ce qui se passe avec import <package> ??
#!python
# fichier pkg/init.py
x = 1
print 'pkg init'
#!python
# fichier pkg/mod.py
y = 2
print 'in mod.py'
#!python
>>> import pkg.mod
pkg init
in mod.py
>>> import pkg.mod
>>> reload(pkg)
pkg init
>>> pkg.x
1
>>> pkg.mod.y
2
#!html
<br clear=right>
from/as …

…permet d’allléger l’accès ultérieur au module, mais accroît les risques de conflits de noms, et perd l’accès au package intermédiaire
#!python
# fichier pkg/init.py
x = 1
print 'pkg init'
#!python
# fichier pkg/mod.py
y = 2
z 3
print 'in mod.py'
#!python
>>> from pkg import mod
pkg init
in mod.py
>>> import pkg.mod as m
>>> mod.y
2
>>> m.z
3
#!html
<br clear=right>
Importer tous les modules
Aucun moyen implicite et automatique.Trois possibilités explicites :
1.
#!python
# fichier pkg/init.py
from . import mod1
from . import mod2
#!python
>>> import pkg
>>> pkg.mod1...
1.
#!python
# fichier pkg/init.py
from . import mod1
from . import mod2
#!python
>>> from pkg import *
>>> mod1...
1.
#!python
# fichier pkg/init.py
all = [ 'mod1', 'mod2' ]
#!python
>>> from pkg import *
>>> mod1...
#!comment
pas de "from *" au niveau des paquets
le all se comporte toujours de facon relative
#!html
<br clear=right>
Hiérarchie de paquets

On peut imbriquer autant de niveaux de répertoires que désiré, avec autant de fichiers !init!.py .
#!python
# fichier dir1/init.py
x = 1
print 'dir1 init'
#!python
# fichier dir1/dir2/init.py
y = 2
print 'dir2 init'
#!python
# fichier dir1/dir2/mod.py
z = 3
print 'in mod.py'
#!python
>>> import dir1.dir2.mod
dir1 init
dir2 init
in mod.py
>>> import dir1.dir2.mod
>>> reload(dir1)
dir1 init
>>> reload(dir1.dir2)
dir2 init
#!html
<br clear=right>
Modules en mémoire

#!python
>>> dir1
<module 'dir1' from 'dir1/init.pyc'>
>>> dir1.dir2
<module 'dir1.dir2' from 'dir1/dir2/init.pyc'>
>>> dir1.dir2.mod
<module 'dir1.dir2.mod' from 'dir1/dir2/mod.pyc'>
>>> dir1.x
1
>>> dir1.dir2.y
2
>>> dir1.dir2.mod.z
3
#!html
<br clear=right>
Noms des modules

#!python
>>> dir1.name
'dir1'
>>> dir1.dir2.name
'dir1.dir2'
>>> dir1.dir2.mod.name
'dir1.dir2.mod'
>>> name
'main'
#!html
<br clear=right>