"modulefinder" --- Buscar módulos usados por un script
******************************************************

**Código fuente:** Lib/modulefinder.py

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

Este módulo provee una clase "ModuleFinder" que puede ser usada para
determinar el conjunto de módulos importados en un script.
"modulefinder.py" puede también ejecutarse como un script, dando el
nombre de un archivo de Python como argumento, tras lo cual se
imprimirá un reporte de los módulos importados.

modulefinder.AddPackagePath(pkg_name, path)

   Registra que el paquete llamado *pkg_name* pueda ser encontrado en
   el *path* especificado.

modulefinder.ReplacePackage(oldname, newname)

   Permite especificar que el módulo llamado *oldname* es de hecho el
   paquete llamado *newname*.

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

   Esta clase provee los métodos "run_script()" y "report()" que
   determinan el conjunto de módulos importados por un script. *path*
   puede ser un listado de directorios a buscar por módulos; si no es
   especificado, se usará "sys.path". *debug* define el nivel de
   depuración; valores más altos hacen que la clase imprima mensajes
   de depuración acerca de lo que está haciendo. *excludes* es una
   lista de nombres de módulos que serán excluidos del análisis.
   *replace_paths* es una lista de tuplas "(oldpath, newpath)" que
   serán remplazadas en las rutas de los módulos.

   report()

      Imprime un reporte a la salida estándar que lista los módulos
      importados por el script y sus rutas, así como los módulos que
      faltan o parecieran faltar.

   run_script(pathname)

      Analiza los contenidos del archivo *pathname*, que debe contener
      código Python.

   modules

      Un diccionario que mapea los nombres de los módulos a los
      módulos. Vea Ejemplo de uso de ModuleFinder.


Ejemplo de uso de "ModuleFinder"
================================

El script que será analizado más adelante (bacon.py):

   import re, itertools

   try:
       import baconhameggs
   except ImportError:
       pass

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

El script que generará el reporte 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()))

Resultado de ejemplo (puede variar dependiendo de la arquitectura):

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