Jak wyświetlić listę zaimportowanych modułów?

152

Jak wyliczyć wszystkie zaimportowane moduły?

Np. Chciałbym uzyskać ['os', 'sys']z tego kodu:

import os
import sys
alex2k8
źródło
Nie sądzę, żeby było to możliwe w natywnym Pythonie, ale to poprzednie pytanie może pomóc: stackoverflow.com/questions/2572582/ ...
parent5446
6
Czasami (np. Z ipython --pylab) interpreter języka Python jest uruchamiany z załadowanymi wstępnie zdefiniowanymi modułami. Pozostaje pytanie, jak poznać alias używany o_O
yota

Odpowiedzi:

182
import sys
sys.modules.keys()

Przybliżeniem pobrania wszystkich importów tylko dla bieżącego modułu byłoby sprawdzenie globals()modułów:

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

Nie zwróci to importu lokalnego ani importu niemodułowego, takiego jak from x import y. Zwróć uwagę, że to zwraca, val.__name__więc otrzymasz oryginalną nazwę modułu, jeśli była używana import module as alias; Zamiast tego wpisz nazwę, jeśli chcesz alias.

Glenn Maynard
źródło
2
Lub możesz znaleźć przecięcie sys.modules z globals i nie wykonywać żadnych testów typu.
Marcin
Jest to jedyne rozwiązanie, które zwraca pełną nazwę modułu po ponownym zdefiniowaniu nazwy zaimportowanego modułu. Na przykład, jeśli to zrobisz import numpy as np, to powróci, numpypodczas gdy pozostałe dwie sugestie powrócą np.
joelostblom
1
Jeśli z jakiegoś powodu potrzebujesz zarówno nazwy modułu, jak i aliasu, jest to dostępne w namezmiennej. W ten sposób, aby wygenerować łańcuch, import numpy as npwykonaj coś podobnego do tego, 'import %s as %s' % (val.__name__, name)gdzie znajduje się instrukcja yield.
André C. Andersen
38

Znajdź przecięcie sys.modulesz globals:

import sys
modulenames = set(sys.modules) & set(globals())
allmodules = [sys.modules[name] for name in modulenames]
Marcin
źródło
1
Może frozensetzamiast tego użyj tutaj? - Oto mój 1-liner:frozenset(imap(lambda name: modules[name], frozenset(modules) & frozenset(globals())))
AT
Powyższe rozwiązanie nie wyodrębnia modułów, które są importowane za pomocą frompolecenia. Na przykład rozważ from scipy.stats import norm. To nie mówi mi, że normmoduł jest importowany. Jak można to włączyć do tego?
Ujjwal
@Ujjwal Cóż, te moduły nie są importowane, tylko ich komponenty. Jeśli potrzebujesz wszystkiego, po prostu użyj sys.modules.
Marcin
28

Jeśli chcesz to zrobić spoza skryptu:

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)

Spowoduje to wyświetlenie wszystkich modułów załadowanych przez myscript.py.

Lila
źródło
1
W przypadku Pythona 3 zmień .iteritems()na .items()i nawiasy dla instrukcji print
kardamon
Uwaga: ulega awarii, gdy masz do czynienia z przestrzenią nazw: bugs.python.org/issue40350
mPrinC
To wycięte samo ma 204 zależności na moim komputerze ... Czy to dziwne lub oczekiwane?
Guimoute
12
print [key for key in locals().keys()
       if isinstance(locals()[key], type(sys)) and not key.startswith('__')]
Mike Axiak
źródło
8

powiedzmy, że zaimportowałeś matematykę i ponownie:

>>import math,re

teraz zobaczyć to samo zastosowanie

>>print(dir())

Jeśli uruchomisz go przed i po imporcie, widać różnicę.

mukundha reddy
źródło
6

W rzeczywistości działa całkiem dobrze z:

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

Spowoduje to utworzenie listy z nazwami modułów, które można zaimportować .

fabiand
źródło
To tak naprawdę nie odpowiada na pytanie.
bergercookie
4

Ten kod zawiera listę modułów zaimportowanych przez Twój moduł:

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]

Powinien być przydatny, jeśli chcesz wiedzieć, jakie moduły zewnętrzne zainstalować w nowym systemie, aby uruchomić kod, bez konieczności ponownego próbowania.

Nie wyświetli sysmodułu ani modułów zaimportowanych z niego.

Ohad Cohen
źródło
1

Kradzież z @Lila (nie można było komentować z powodu braku formatowania), pokazuje również / path / modułu:

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

który produkuje:

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

.. nadaje się do greppingu czy co masz. Ostrzegam, to długo!

JDonner
źródło
0

W tym przypadku lubię używać rozumienia listy:

>>> [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
źródło