Wie liste ich importierte Module auf?

152

Wie werden alle importierten Module aufgelistet?

ZB möchte ich ['os', 'sys']von diesem Code erhalten:

import os
import sys
alex2k8
quelle
Ich denke nicht, dass es in nativem Python möglich ist, aber diese vorherige Frage könnte helfen: stackoverflow.com/questions/2572582/…
parent5446
6
Manchmal wird (z. B. mit ipython --pylab) Python-Interpreter mit geladenen vordefinierten Modulen gestartet. Es bleibt die Frage, wie man den verwendeten Alias ​​o_O
yota

Antworten:

182
import sys
sys.modules.keys()

Eine Annäherung, um alle Importe nur für das aktuelle Modul zu erhalten, wäre die Überprüfung globals()auf Module:

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

Dies gibt keine lokalen Importe oder Nicht-Modul-Importe wie zurück from x import y. Beachten Sie, dass dies zurückgegeben wird, val.__name__sodass Sie den ursprünglichen Modulnamen erhalten, wenn Sie ihn verwendet haben import module as alias. Geben Sie stattdessen den Namen ein, wenn Sie den Alias ​​möchten.

Glenn Maynard
quelle
2
Oder Sie finden den Schnittpunkt von sys.modules mit Globals und führen überhaupt keine Typprüfungen durch.
Marcin
Dies ist die einzige Lösung, die den vollständigen Modulnamen zurückgibt, wenn Sie den Namen Ihres importierten Moduls neu definieren. Wenn Sie dies beispielsweise tun import numpy as np, wird dies zurückgegeben, numpywährend die beiden anderen Vorschläge zurückgegeben werden np.
Joelostblom
1
Wenn Sie aus irgendeinem Grund sowohl den Modulnamen als auch den Alias ​​benötigen, ist dieser in der nameVariablen verfügbar . Um den String zu generieren, import numpy as npmachen Sie so etwas wie dort, 'import %s as %s' % (val.__name__, name)wo sich die Yield-Anweisung jetzt befindet.
André C. Andersen
38

Finden Sie den Schnittpunkt von sys.modulesmit globals:

import sys
modulenames = set(sys.modules) & set(globals())
allmodules = [sys.modules[name] for name in modulenames]
Marcin
quelle
1
Vielleicht frozensetstattdessen ein hier verwenden? - Hier ist mein 1-Liner:frozenset(imap(lambda name: modules[name], frozenset(modules) & frozenset(globals())))
AT
Die obige Lösung extrahiert keine Module, die mit dem fromBefehl importiert werden . Zum Beispiel überlegen from scipy.stats import norm. Dies sagt mir nicht, dass das normModul importiert wird. Wie kann das in das einbezogen werden?
Ujjwal
@Ujjwal Nun, diese Module werden nicht importiert, nur ihre Komponenten. Wenn Sie alles brauchen, verwenden Sie einfach sys.modules.
Marcin
28

Wenn Sie dies von außerhalb des Skripts tun möchten:

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)

Dadurch werden alle von myscript.py geladenen Module gedruckt.

Lila
quelle
1
Ändern Sie für Python 3 .iteritems()in .items()und Klammern für die Druckanweisung
Kardamom
Hinweis: Es stürzt ab, wenn Sie mit dem Namespace arbeiten: bugs.python.org/issue40350
mPrinC
Dieser Snipped selbst hat 204 Abhängigkeiten von meinem Computer ... Ist das seltsam oder erwartet?
Guimoute
12
print [key for key in locals().keys()
       if isinstance(locals()[key], type(sys)) and not key.startswith('__')]
Mike Axiak
quelle
8

Nehmen wir an, Sie haben Mathe importiert und re:

>>import math,re

jetzt, um die gleiche Verwendung zu sehen

>>print(dir())

Wenn Sie es vor dem Import und nach dem Import ausführen, können Sie den Unterschied erkennen.

Mukundha Reddy
quelle
6

Es funktioniert eigentlich ganz gut mit:

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

Dadurch wird eine Liste mit importierbaren Modulnamen erstellt .

fabelhaft
quelle
Das beantwortet die Frage nicht wirklich.
Bergercookie
4

Dieser Code listet Module auf, die von Ihrem Modul importiert wurden:

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]

Dies sollte hilfreich sein, wenn Sie wissen möchten, welche externen Module auf einem neuen System installiert werden müssen, um Ihren Code auszuführen, ohne es erneut versuchen zu müssen.

Das sysoder die daraus importierten Module werden nicht aufgelistet .

Ohad Cohen
quelle
1

Beim Stehlen von @Lila (konnte keinen Kommentar abgeben, da keine Formatierung vorgenommen wurde) wird auch das / path / des Moduls angezeigt:

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

welches produziert:

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

.. geeignet zum hacken oder was hast du. Seien Sie gewarnt, es ist lang!

JDonner
quelle
0

In diesem Fall verwende ich gerne ein Listenverständnis:

>>> [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
quelle