Comment lister les modules importés?

152

Comment énumérer tous les modules importés?

Par exemple, je voudrais obtenir ['os', 'sys']de ce code:

import os
import sys
alex2k8
la source
Je ne pense pas que ce soit possible en Python natif, mais cette question précédente pourrait aider: stackoverflow.com/questions/2572582/…
parent5446
6
Parfois (ex: avec ipython --pylab) l'interpréteur python est lancé avec des modules prédéfinis chargés. Reste la question, pour savoir comment connaître l'alias utilisé o_O
yota

Réponses:

182
import sys
sys.modules.keys()

Une approximation pour obtenir toutes les importations pour le module actuel uniquement serait d'inspecter les globals()modules:

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

Cela ne retournera pas les importations locales ou les importations non-module comme from x import y. Notez que cela retourne val.__name__donc vous obtenez le nom du module d'origine si vous avez utilisé import module as alias; donnez le nom à la place si vous voulez l'alias.

Glenn Maynard
la source
2
Ou vous pouvez trouver l'intersection de sys.modules avec des globals, et ne faire aucun test de type.
Marcin
C'est la seule solution qui renvoie le nom complet du module lorsque vous redéfinissez le nom de votre module importé. Par exemple, si vous le faites import numpy as np, cela reviendra numpytandis que les deux autres suggestions reviendront np.
joelostblom
1
Si, pour une raison quelconque, vous avez besoin à la fois du nom du module et de l'alias, celui-ci est disponible dans la namevariable. Ainsi, pour générer la chaîne, import numpy as npfaites quelque chose comme 'import %s as %s' % (val.__name__, name)où se trouve maintenant l'instruction yield.
André C. Andersen
38

Trouvez l'intersection de sys.modulesavec globals:

import sys
modulenames = set(sys.modules) & set(globals())
allmodules = [sys.modules[name] for name in modulenames]
Marcin
la source
1
Peut-être utiliser un frozensetici à la place? - Voici mon 1-liner:frozenset(imap(lambda name: modules[name], frozenset(modules) & frozenset(globals())))
AT
La solution ci-dessus n'extrait pas les modules importés à l'aide de la fromcommande. Par exemple, considérez from scipy.stats import norm. Cela ne me dit pas que le normmodule est importé. Comment cela peut-il être intégré à cela?
Ujjwal
@Ujjwal Eh bien, ces modules ne sont pas importés, juste leurs composants. Si vous avez besoin de tout, utilisez simplement sys.modules.
Marcin
28

Si vous souhaitez effectuer cette opération depuis l'extérieur du 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)

Cela affichera tous les modules chargés par myscript.py.

Lilas
la source
1
Pour Python 3, le changement .iteritems()de .items()et supports pour l'instruction d'impression
cardamome
Remarque: il plante lorsque vous traitez avec un espace de noms: bugs.python.org/issue40350
mPrinC
Ce snipped lui-même a 204 dépendances sur ma machine ... Est-ce bizarre ou attendu?
Guimoute
12
print [key for key in locals().keys()
       if isinstance(locals()[key], type(sys)) and not key.startswith('__')]
Mike Axiak
la source
8

disons que vous avez importé des mathématiques et re:

>>import math,re

maintenant pour voir la même utilisation

>>print(dir())

Si vous l'exécutez avant l'importation et après l'importation, on peut voir la différence.

mukundha reddy
la source
6

Cela fonctionne plutôt bien avec:

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

Cela créera une liste avec des noms de modules importables .

Fabiand
la source
Cela ne répond pas vraiment à la question.
bergercookie
4

Ce code liste les modules importés par votre module:

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]

Cela devrait être utile si vous voulez savoir quels modules externes installer sur un nouveau système pour exécuter votre code, sans avoir besoin d'essayer encore et encore.

Il ne listera pas le sysou les modules importés depuis celui-ci.

Ohad Cohen
la source
1

Voler @Lila (impossible de faire un commentaire faute de formatage), cela montre également le / chemin / du module:

#!/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()

qui produit:

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
...

.. approprié pour grepping ou quoi que ce soit. Soyez prévenu, c'est long!

JDonner
la source
0

J'aime utiliser une compréhension de liste dans ce cas:

>>> [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
la source