¿Cómo enumerar los módulos importados?

152

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

Por ejemplo, me gustaría obtener ['os', 'sys']de este código:

import os
import sys
alex2k8
fuente
No creo que sea posible en Python nativo, pero esta pregunta anterior podría ayudar: stackoverflow.com/questions/2572582/…
parent5446
66
A veces (por ejemplo, con ipython --pylab) el intérprete de Python se inicia con módulos predefinidos cargados. Queda la pregunta, sobre cómo saber el alias utilizado o_O
yota

Respuestas:

182
import sys
sys.modules.keys()

Una aproximación para obtener todas las importaciones para el módulo actual solo sería inspeccionar los globals()módulos:

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

Esto no devolverá importaciones locales, o importaciones que no sean módulos como from x import y. Tenga en cuenta que esto regresa val.__name__para que obtenga el nombre del módulo original si lo usó import module as alias; en su lugar, escriba el nombre si desea el alias.

Glenn Maynard
fuente
2
O puede encontrar la intersección de sys.modules con globals, y no realizar ninguna prueba de tipo.
Marcin
Esta es la única solución que devuelve el nombre completo del módulo cuando redefine el nombre de su módulo importado. Por ejemplo, si lo hace import numpy as np, esto regresará numpymientras que las otras dos sugerencias regresarán np.
joelostblom
1
Si por alguna razón necesita tanto el nombre del módulo como el alias, está disponible en la namevariable. Por lo tanto, para generar la cadena, import numpy as nphaga algo como 'import %s as %s' % (val.__name__, name)donde está ahora la declaración de rendimiento.
André C. Andersen
38

Encuentre la intersección de sys.modulescon globals:

import sys
modulenames = set(sys.modules) & set(globals())
allmodules = [sys.modules[name] for name in modulenames]
Marcin
fuente
1
Tal vez use un frozensetaquí en su lugar? - Aquí está mi 1-liner:frozenset(imap(lambda name: modules[name], frozenset(modules) & frozenset(globals())))
EN
La solución anterior no extrae los módulos que se importan con el fromcomando. Por ejemplo, considere from scipy.stats import norm. Esto no me dice que el normmódulo se importa. ¿Cómo se puede incorporar eso a esto?
Ujjwal
@Ujjwal Bueno, esos módulos no se importan, solo sus componentes. Si necesita todo, solo use sys.modules.
Marcin
28

Si quieres hacer esto desde fuera del script:

Python 2

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

Python 3

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

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

Lila
fuente
1
Para Python 3, el cambio .iteritems()a .items()y soportes para la instrucción print
cardamomo
Nota: se bloquea cuando se trata de un espacio de nombres: bugs.python.org/issue40350
mPrinC
Este recorte en sí mismo tiene 204 dependencias en mi máquina ... ¿Es extraño o esperado?
Guimoute
12
print [key for key in locals().keys()
       if isinstance(locals()[key], type(sys)) and not key.startswith('__')]
Mike Axiak
fuente
8

Digamos que has importado matemáticas y re:

>>import math,re

ahora para ver el mismo uso

>>print(dir())

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

mukundha reddy
fuente
6

En realidad está funcionando bastante bien con:

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

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

fabiand
fuente
Eso realmente no responde la pregunta.
bergercookie
4

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]

Debería ser útil si desea saber qué módulos externos instalar en un nuevo sistema para ejecutar su código, sin la necesidad de intentarlo una y otra vez.

No enumerará el sysmódulo o módulos importados de él.

Ohad Cohen
fuente
1

Robando a @Lila (no se pudo hacer un comentario debido a que no se ha formateado), esto también muestra la ruta / del módulo /:

#!/usr/bin/env python
import sys
from modulefinder import ModuleFinder
finder = ModuleFinder()
# Pass the name of the python file of interest
finder.run_script(sys.argv[1])
# This is what's different from @Lila's script
finder.report()

que produce:

Name                      File
----                      ----

...
m token                     /opt/rh/rh-python35/root/usr/lib64/python3.5/token.py
m tokenize                  /opt/rh/rh-python35/root/usr/lib64/python3.5/tokenize.py
m traceback                 /opt/rh/rh-python35/root/usr/lib64/python3.5/traceback.py
...

.. adecuado para grepping o lo que tengas. ¡Ten cuidado, es largo!

JDonner
fuente
0

Me gusta usar una lista de comprensión en este caso:

>>> [w for w in dir() if w == 'datetime' or w == 'sqlite3']
['datetime', 'sqlite3']

# To count modules of interest...
>>> count = [w for w in dir() if w == 'datetime' or w == 'sqlite3']
>>> len(count)
2

# To count all installed modules...
>>> count = dir()
>>> len(count)
Dex
fuente