2011-02-01 14 views
88

Come enumerare tutti i moduli importati?Come elencare i moduli importati?

E.g. Vorrei ottenere [ 'os', 'sys'] dal questo codice

import os 
import sys 
+5

volte (es: con 'ipython --pylab') interprete Python viene lanciato con moduli predefiniti caricati. Domanda rimane, per il modo di conoscere gli alias utilizzati o_O – yota

+0

non credo sia possibile in Python nativo, ma questa domanda precedente potrebbe aiutare: http: // StackOverflow.it/questions/2572582/return-a-list-of-imported-python-modules-used-in-a-script – parent5446

risposta

107
import sys 
sys.modules.keys() 

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

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

Questo non tornerà importazioni locali, o le importazioni non modulo come from x import y. Si noti che questo restituisce val.__name__ in modo da ottenere il nome del modulo originale se si è utilizzato import module as alias; rendi il nome invece se vuoi l'alias.

+1

Oppure è possibile trovare l'intersezione di sys.modules con globals e non eseguire affatto test di tipo. – Marcin

+8

Infine, penso che sia meglio usare 'list (imports())' per elencare tutti i moduli importati. –

+0

Questa è l'unica soluzione che restituisce il nome completo del modulo quando si ridefinisce il nome del modulo importato. Ad esempio, se si importa 'numpy import come np', questo restituirà' numpy' mentre gli altri due suggerimenti restituiranno 'np'. –

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

trovare l'intersezione di sys.modules con globals:

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

Forse usare un 'frozenset' qui invece? - Ecco il mio 1-liner: 'frozenset (imap (nome lambda: moduli [nome], frozenset (moduli) e frozenset (globals())))' –

5

che funzioni abbastanza bene con:

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

Questo creerà una lista con importabili nomi dei moduli.

10

Se si vuole fare questo al di fuori dello script:

from modulefinder import ModuleFinder 
finder = ModuleFinder() 
finder.run_script("myscript.py") 
for name, mod in finder.modules.iteritems(): 
    print name 

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

+0

qualche idea del perché questo è downvoted? –

2

Questo codice elenca i moduli importati dal 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 si desidera sapere quali moduli esterni da installare su un nuovo sistema per eseguire il codice, senza la necessità di provare di nuovo e ancora.

Non elencherà il modulo sys o moduli importati da esso.

1

diciamo aver importato la matematica e ri:

import math, ri

ora a vedere lo stesso uso

stampa (dir())

Se si esegue prima l'importazione e dopo l'importazione, si può vedere la differenza.

+0

Benvenuti in StackOverflow: se inserisci codice, XML o campioni di dati, evidenzia queste righe nell'editor di testo e fai clic sul pulsante "esempi di codice" ({}) sulla barra degli strumenti dell'editor o su Ctrl + K sulla tastiera per il formato e la sintassi lo evidenziano! – WhatsThePoint

Problemi correlati