Come elencare i moduli importati?


152

Come enumerare tutti i moduli importati?

Ad esempio, vorrei ottenere ['os', 'sys']da questo codice:

import os
import sys

Non credo sia possibile in nativa Python, ma questo precedente aiuto domanda potrebbe: stackoverflow.com/questions/2572582/...
parent5446

6
A volte (ex: with ipython --pylab) l'interprete python viene avviato con moduli predefiniti caricati. Resta da chiedersi come sapere l'alias usato o_O
yota il

Risposte:


182
import sys
sys.modules.keys()

Un'approssimazione di ottenere tutte le importazioni solo per il modulo corrente sarebbe quella di ispezionare i globals()moduli:

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

Questo non restituirà importazioni locali o importazioni non di moduli come from x import y. Si noti che questo restituisce val.__name__in modo da ottenere il nome del modulo originale se è stato utilizzato import module as alias; cedere invece il nome se si desidera l'alias.


2
Oppure potresti trovare l'intersezione di sys.modules con i globali e non eseguire alcun tipo di test.
Marcin,

Questa è l'unica soluzione che restituisce il nome completo del modulo quando si ridefinisce il nome del modulo importato. Ad esempio, se lo fai import numpy as np, questo verrà restituito numpymentre verranno restituiti gli altri due suggerimenti np.
Joelostblom,

1
Se per qualche motivo hai bisogno sia del nome del modulo che dell'alias, questo è disponibile nella namevariabile. Quindi, per generare la stringa, import numpy as npfare qualcosa di simile a 'import %s as %s' % (val.__name__, name)dove si trova ora l'istruzione yield.
André C. Andersen,

38

Trova l'intersezione di sys.modulescon globals:

import sys
modulenames = set(sys.modules) & set(globals())
allmodules = [sys.modules[name] for name in modulenames]

1
Forse usi un frozensetqui invece? - Ecco il mio 1-liner:frozenset(imap(lambda name: modules[name], frozenset(modules) & frozenset(globals())))
AL

La soluzione precedente non estrae i moduli che vengono importati utilizzando il fromcomando. Per esempio, considera from scipy.stats import norm. Questo non mi dice che il normmodulo è importato. Come può essere incorporato in questo?
Ujjwal,

@Ujjwal Bene, quei moduli non vengono importati, ma solo i loro componenti. Se hai bisogno di tutto, usa semplicemente sys.modules.
Marcin,

28

Se vuoi farlo dall'esterno dello script:

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)

Questo stamperà tutti i moduli caricati da myscript.py.


1
Per Python 3, cambia .iteritems()in .items()e parentesi per l'istruzione print
cardamomo

Nota: si blocca quando hai a che fare con lo spazio dei nomi: bugs.python.org/issue40350
mPrinC

Questo spezzato stesso ha 204 dipendenze sulla mia macchina ... È strano o previsto?
Guimoute,

12
print [key for key in locals().keys()
       if isinstance(locals()[key], type(sys)) and not key.startswith('__')]

8

diciamo che hai importato la matematica e ri:

>>import math,re

ora per vedere lo stesso uso

>>print(dir())

Se lo esegui prima dell'importazione e dopo l'importazione, si può vedere la differenza.


6

In realtà funziona abbastanza bene con:

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

Questo creerà un elenco con nomi di moduli impostabili .


Questo non risponde davvero alla domanda.
Bergercookie,

4

Questo codice elenca i moduli importati dal tuo modulo:

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]

Dovrebbe essere utile se vuoi sapere quali moduli esterni installare su un nuovo sistema per eseguire il tuo codice, senza la necessità di riprovare ancora e ancora.

Non elencherà il sysmodulo oi moduli importati da esso.


1

Rubando da @Lila (non è stato possibile fare un commento a causa della mancata formattazione), questo mostra anche il modulo / path /:

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

che produce:

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

.. adatto per il grepping o cosa hai. Attenzione, è lungo!


0

Mi piace usare una comprensione dell'elenco in questo caso:

>>> [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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.