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.
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]
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 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)
Spowoduje to wyświetlenie wszystkich modułów załadowanych przez myscript.py.
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 ifnot 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.
Kradzież z @Lila (nie można było komentować z powodu braku formatowania), pokazuje również / path / modułu:
#!/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()
który produkuje:
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
...
.. nadaje się do greppingu czy co masz. Ostrzegam, to długo!
>>>[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
) interpreter języka Python jest uruchamiany z załadowanymi wstępnie zdefiniowanymi modułami. Pozostaje pytanie, jak poznać alias używany o_OOdpowiedzi:
Przybliżeniem pobrania wszystkich importów tylko dla bieżącego modułu byłoby sprawdzenie
globals()
modułów: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żywanaimport module as alias
; Zamiast tego wpisz nazwę, jeśli chcesz alias.źródło
import numpy as np
, to powróci,numpy
podczas gdy pozostałe dwie sugestie powrócąnp
.name
zmiennej. W ten sposób, aby wygenerować łańcuch,import numpy as np
wykonaj coś podobnego do tego,'import %s as %s' % (val.__name__, name)
gdzie znajduje się instrukcja yield.Znajdź przecięcie
sys.modules
zglobals
:źródło
frozenset
zamiast tego użyj tutaj? - Oto mój 1-liner:frozenset(imap(lambda name: modules[name], frozenset(modules) & frozenset(globals())))
from
polecenia. Na przykład rozważfrom scipy.stats import norm
. To nie mówi mi, żenorm
moduł jest importowany. Jak można to włączyć do tego?Jeśli chcesz to zrobić spoza skryptu:
Python 2
Python 3
Spowoduje to wyświetlenie wszystkich modułów załadowanych przez myscript.py.
źródło
.iteritems()
na.items()
i nawiasy dla instrukcji printźródło
powiedzmy, że zaimportowałeś matematykę i ponownie:
teraz zobaczyć to samo zastosowanie
Jeśli uruchomisz go przed i po imporcie, widać różnicę.
źródło
W rzeczywistości działa całkiem dobrze z:
Spowoduje to utworzenie listy z nazwami modułów, które można zaimportować .
źródło
Ten kod zawiera listę modułów zaimportowanych przez Twój moduł:
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
sys
modułu ani modułów zaimportowanych z niego.źródło
Kradzież z @Lila (nie można było komentować z powodu braku formatowania), pokazuje również / path / modułu:
który produkuje:
.. nadaje się do greppingu czy co masz. Ostrzegam, to długo!
źródło
W tym przypadku lubię używać rozumienia listy:
źródło