¿Cómo enumero los módulos importados con su versión?

Necesito enumerar todos los módulos importados junto con su versión. Parte de mi código solo funciona con versiones específicas y quiero guardar la versión de los paquetes para poder volver a buscarlos en el futuro. Listado de los nombres de los paquetes de obras:

modules = list(set(sys.modules) & set(globals())) print modules 

Pero si ahora quiero obtener la versión de los elementos de la lista no funciona con:

 for module in modules: print module.__version__ 

¿Hay alguna forma de dirigir el comando .__version__ con una cadena, o tengo que buscar otra forma para obtener el nombre y la versión? En otras preguntas, solo se tratan los nombres de los módulos: ¿Cómo listar los módulos importados?

Porque tiene una lista de cadenas del nombre del módulo, no el módulo en sí. Prueba esto:

 for module_name in modules: module = sys.modules[module_name] print module_name, getattr(module, '__version__', 'unknown') 

Tenga en cuenta que no todos los módulos siguen la convención de almacenar la información de la versión en __version__ .

Uno de los problemas que he tenido con los grandes progtwigs heredados es dónde se han usado los alias ( import thing as stuff ). También suele ser bueno saber exactamente qué archivo se está cargando. Escribí este módulo hace un tiempo que podría hacer lo que necesitas:

spection.py

 """ Python 2 version 10.1.14 """ import inspect import sys import re def look(): for name, val in sys._getframe(1).f_locals.items(): if inspect.ismodule(val): fullnm = str(val) if not '(built-in)' in fullnm and \ not __name__ in fullnm: m = re.search(r"'(.+)'.*'(.+)'", fullnm) module,path = m.groups() print "%-12s maps to %s" % (name, path) if hasattr(val, '__version__'): print "version:", val.__version__ 

Usándolo:

 import sys import matplotlib import spection spection.look() 

Da (en mi sistema):

 matplotlib maps to /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/matplotlib/__init__.pyc version: 1.3.1 

Notarás que omito los builtins como sys y el propio módulo de espección.