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

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.


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]

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.


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('__')]

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


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


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.


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!


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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.