Le bon outil pour ce travail est pkgutil.walk_packages.
Pour lister tous les modules de votre système:
import pkgutil
for importer, modname, ispkg in pkgutil.walk_packages(path=None, onerror=lambda x: None):
print(modname)
Sachez que walk_packages importe tous les sous-packages, mais pas les sous-modules.
Si vous souhaitez lister tous les sous-modules d'un certain package, vous pouvez utiliser quelque chose comme ceci:
import pkgutil
import scipy
package=scipy
for importer, modname, ispkg in pkgutil.walk_packages(path=package.__path__,
prefix=package.__name__+'.',
onerror=lambda x: None):
print(modname)
iter_modules ne répertorie que les modules qui ont une profondeur d'un niveau. walk_packages récupère tous les sous-modules. Dans le cas de scipy, par exemple, walk_packages renvoie
scipy.stats.stats
tandis que iter_modules ne renvoie que
scipy.stats
La documentation sur pkgutil ( http://docs.python.org/library/pkgutil.html ) ne répertorie pas toutes les fonctions intéressantes définies dans /usr/lib/python2.6/pkgutil.py.
Cela signifie peut-être que les fonctions ne font pas partie de l'interface "publique" et sont susceptibles de changer.
Cependant, au moins à partir de Python 2.6 (et peut-être des versions antérieures?) Pkgutil est livré avec une méthode walk_packages qui parcourt de manière récursive tous les modules disponibles.