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