2011-02-01 15 views
88

¿Cómo se enumeran todos los módulos importados?¿Cómo enumerar los módulos importados?

E.g. Me gustaría obtener [ 'OS', 'sys'] porque de este código

import os 
import sys 
+5

A veces (por ejemplo, con 'ipython --pylab') el intérprete python se inicia con los módulos predefinidos cargados. Queda la pregunta, para saber cómo se conoce el alias usado o_O – yota

+0

No creo que sea posible en Python nativo, pero esta pregunta anterior podría ayudar: http: // stackoverflow.com/questions/2572582/return-a-list-of-imported-python-modules-used-in-a-script – parent5446

Respuesta

107
import sys 
sys.modules.keys() 

Una aproximación de conseguir todas las importaciones para el módulo actual sólo sería para inspeccionar globals() para módulos:

import types 
def imports(): 
    for name, val in globals().items(): 
     if isinstance(val, types.ModuleType): 
      yield val.__name__ 

Esto no devolverá las importaciones locales, o las importaciones sin módulo como from x import y. Tenga en cuenta que esto devuelve val.__name__ para que obtenga el nombre del módulo original si usó import module as alias; nombre de rendimiento en su lugar si desea el alias.

+1

O puede encontrar la intersección de sys.modules con globales, y no hacer ninguna prueba de tipo. – Marcin

+8

Finalmente, creo que es mejor usar 'list (imports())' para enumerar todos los módulos importados. –

+0

Esta es la única solución que devuelve el nombre completo del módulo cuando se redefine el nombre de su módulo importado. Por ejemplo, si 'importa numpy como np', esto devolverá' numpy' mientras que las otras dos sugerencias devolverán 'np'. –

11
print [key for key in locals().keys() 
     if isinstance(locals()[key], type(sys)) and not key.startswith('__')] 
25

Encuentra la intersección de sys.modules con globals:

import sys 
modulenames = set(sys.modules)&set(globals()) 
allmodules = [sys.modules[name] for name in modulenames] 
+1

¿Tal vez use un 'frozenset' aquí en su lugar? - Aquí está mi 1-liner: 'frozenset (imap (nombre lambda: modules [nombre], frozenset (módulos) & frozenset (globals())))' –

5

de que realmente funciona bastante bien con:

import sys 
mods = [m.__name__ for m in sys.modules.values() if m] 

Esto creará una lista con importables nombres de los módulos.

10

Si quieres hacer esto desde fuera del script:

from modulefinder import ModuleFinder 
finder = ModuleFinder() 
finder.run_script("myscript.py") 
for name, mod in finder.modules.iteritems(): 
    print name 

Esto imprimirá todos los módulos cargados por myscript.py.

+0

¿Alguna idea de por qué esto se degrada? –

2

Este código enumera los módulos importados por su módulo:

import sys 
before = [str(m) for m in sys.modules] 
import my_module 
after = [str(m) for m in sys.modules] 
print [m for m in after if not m in before] 

Debe ser útil si desea saber qué módulos externos a instalar en un nuevo sistema para ejecutar el código, sin la necesidad de intentar una y otra de nuevo.

No mostrará el módulo sys ni los módulos importados de él.

1

Digamos que haya importado matemáticas y re:

matemáticas importación, re

ahora a ver el mismo uso

de impresión (dir())

Si lo ejecuta antes de la importación y después de la importación, se puede ver la diferencia.

+0

Bienvenido a StackOverflow: si publica código, XML o muestras de datos, resalte esas líneas en el editor de texto y haga clic en el botón "muestras de código" ({}) en la barra de herramientas del editor o use Ctrl + K en su teclado formato y sintaxis resaltarlo! – WhatsThePoint

Cuestiones relacionadas