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 typesdef 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.
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]
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 importModuleFinder
finder =ModuleFinder()
finder.run_script("myscript.py")for name, mod in finder.modules.iteritems():print name
Python 3
from modulefinder importModuleFinder
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.
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 ifnot 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 .
Beim Stehlen von @Lila (konnte keinen Kommentar abgeben, da keine Formatierung vorgenommen wurde) wird auch das / path / des Moduls angezeigt:
#!/usr/bin/env pythonimport sys
from modulefinder importModuleFinder
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:
NameFile--------...
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!
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)
ipython --pylab
) Python-Interpreter mit geladenen vordefinierten Modulen gestartet. Es bleibt die Frage, wie man den verwendeten Alias o_OAntworten:
Eine Annäherung, um alle Importe nur für das aktuelle Modul zu erhalten, wäre die Überprüfung
globals()
auf Module: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 habenimport module as alias
. Geben Sie stattdessen den Namen ein, wenn Sie den Alias möchten.quelle
import numpy as np
, wird dies zurückgegeben,numpy
während die beiden anderen Vorschläge zurückgegeben werdennp
.name
Variablen verfügbar . Um den String zu generieren,import numpy as np
machen Sie so etwas wie dort,'import %s as %s' % (val.__name__, name)
wo sich die Yield-Anweisung jetzt befindet.Finden Sie den Schnittpunkt von
sys.modules
mitglobals
:quelle
frozenset
stattdessen ein hier verwenden? - Hier ist mein 1-Liner:frozenset(imap(lambda name: modules[name], frozenset(modules) & frozenset(globals())))
from
Befehl importiert werden . Zum Beispiel überlegenfrom scipy.stats import norm
. Dies sagt mir nicht, dass dasnorm
Modul importiert wird. Wie kann das in das einbezogen werden?Wenn Sie dies von außerhalb des Skripts tun möchten:
Python 2
Python 3
Dadurch werden alle von myscript.py geladenen Module gedruckt.
quelle
.iteritems()
in.items()
und Klammern für die Druckanweisungquelle
Nehmen wir an, Sie haben Mathe importiert und re:
jetzt, um die gleiche Verwendung zu sehen
Wenn Sie es vor dem Import und nach dem Import ausführen, können Sie den Unterschied erkennen.
quelle
Es funktioniert eigentlich ganz gut mit:
Dadurch wird eine Liste mit importierbaren Modulnamen erstellt .
quelle
Dieser Code listet Module auf, die von Ihrem Modul importiert wurden:
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
sys
oder die daraus importierten Module werden nicht aufgelistet .quelle
Beim Stehlen von @Lila (konnte keinen Kommentar abgeben, da keine Formatierung vorgenommen wurde) wird auch das / path / des Moduls angezeigt:
welches produziert:
.. geeignet zum hacken oder was hast du. Seien Sie gewarnt, es ist lang!
quelle
In diesem Fall verwende ich gerne ein Listenverständnis:
quelle