31.3. "modulefinder" — Identifie les modules utilisés par un script
*******************************************************************

**Code source :** Lib/modulefinder.py

======================================================================

Ce module fournit une classe "ModuleFinder" qui peut être utilisée
pour déterminer la liste des modules importés par un script.
"modulefinder.py" peut aussi être utilisé en tant que script, en
passant le nom du fichier Python en argument, ce qui affichera un
rapport sur les modules importés.

modulefinder.AddPackagePath(pkg_name, path)

   Enregistre que le paquet *pkg_name* peut être trouvé au chemin
   *path* spécifié.

modulefinder.ReplacePackage(oldname, newname)

   Permet de spécifier que le module nommé *oldname* est en réalité le
   paquet nommé *newname*.

class modulefinder.ModuleFinder(path=None, debug=0, excludes=[], replace_paths=[])

   Cette classe fournit les méthodes "run_script()" et "report()" pour
   déterminer l'ensemble des modules importés par un script. *path*
   peut être une liste de dossiers dans lesquels chercher les modules
   ; si non spécifié, "sys.path" est utilisé. *debug* définit le
   niveau de débogage ; des valeurs plus élevées produisent plus de
   détails sur ce que fait la classe. *excludes* est une liste de noms
   de modules à exclure de l'analyse. *replace_paths* est une liste de
   tuples "(oldpath, newpath)" qui seront remplacés dans les chemins
   des modules.

   report()

      Affiche un rapport sur la sortie standard qui liste les modules
      importés par le script et leurs chemins, ainsi que les modules
      manquants ou qui n'ont pas été trouvés.

   run_script(pathname)

      Analyse le contenu du fichier *pathname*, qui doit contenir du
      code Python.

   modules

      Un dictionnaire de correspondance entre nom de modules et
      modules. Voir Exemples d'utilisation de la classe ModuleFinder.


31.3.1. Exemples d'utilisation de la classe "ModuleFinder"
==========================================================

Le script qui sera analysé (*bacon.py*) :

   import re, itertools

   try:
       import baconhameggs
   except ImportError:
       pass

   try:
       import guido.python.ham
   except ImportError:
       pass

Le script qui va afficher le rapport de *bacon.py* :

   from modulefinder import ModuleFinder

   finder = ModuleFinder()
   finder.run_script('bacon.py')

   print('Loaded modules:')
   for name, mod in finder.modules.items():
       print('%s: ' % name, end='')
       print(','.join(list(mod.globalnames.keys())[:3]))

   print('-'*50)
   print('Modules not imported:')
   print('\n'.join(finder.badmodules.keys()))

Exemple de sortie (peut varier en fonction de l'architecture) :

   Loaded modules:
   _types:
   copyreg:  _inverted_registry,_slotnames,__all__
   sre_compile:  isstring,_sre,_optimize_unicode
   _sre:
   sre_constants:  REPEAT_ONE,makedict,AT_END_LINE
   sys:
   re:  __module__,finditer,_expand
   itertools:
   __main__:  re,itertools,baconhameggs
   sre_parse:  _PATTERNENDERS,SRE_FLAG_UNICODE
   array:
   types:  __module__,IntType,TypeType
   ---------------------------------------------------
   Modules not imported:
   guido.python.ham
   baconhameggs
