"modulefinder" --- Find modules used by a script
************************************************

**Quellcode:** Lib/modulefinder.py

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

Dieses Modul stellt die Klasse "ModuleFinder" bereit, mit der sich die
Menge der von einem Skript importierten Module ermitteln lässt.
"modulefinder.py" kann auch selbst als Skript ausgeführt werden, wobei
der Dateiname eines Python-Skripts als Argument übergeben wird;
anschließend wird ein Bericht über die importierten Module ausgegeben.

modulefinder.AddPackagePath(pkg_name, path)

   Vermerkt, dass das Paket namens *pkg_name* unter dem angegebenen
   *path* zu finden ist.

modulefinder.ReplacePackage(oldname, newname)

   Ermöglicht es anzugeben, dass das Modul namens *oldname* in
   Wirklichkeit das Paket namens *newname* ist.

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

   Diese Klasse stellt die Methoden "run_script()" und "report()"
   bereit, um die Menge der von einem Skript importierten Module zu
   ermitteln. *path* kann eine Liste von Verzeichnissen sein, in denen
   nach Modulen gesucht wird; ohne Angabe wird "sys.path" verwendet.
   *debug* legt die Debugging-Stufe fest. Bei höheren Werten gibt die
   Klasse Meldungen darüber aus, was sie gerade tut. *excludes* ist
   eine Liste von Modulnamen, die von der Analyse ausgenommen werden.
   *replace_paths* ist eine Liste von Tupeln der Form "(oldpath,
   newpath)", die in Modulpfaden ersetzt werden.

   report()

      Gibt auf der Standardausgabe einen Bericht aus, der die vom
      Skript importierten Module und ihre Pfade auflistet sowie
      Module, die fehlen oder zu fehlen scheinen.

   run_script(pathname)

      Analysiert den Inhalt der Datei *pathname*, die Python-Code
      enthalten muss.

   modules

      Ein Dictionary, das Modulnamen auf Module abbildet. Siehe
      Beispielhafte Verwendung von ModuleFinder.


Beispielhafte Verwendung von "ModuleFinder"
===========================================

Das Skript, das später analysiert werden soll (bacon.py):

   import re, itertools

   try:
       import baconhameggs
   except ImportError:
       pass

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

Das Skript, das den Bericht zu bacon.py ausgibt:

   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()))

Beispielausgabe (kann je nach Architektur abweichen):

   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
