Como listar módulos importados?


152

Como enumerar todos os módulos importados?

Por exemplo, eu gostaria de obter ['os', 'sys']deste código:

import os
import sys

Eu não acho que seja possível no Python nativo, mas esta pergunta anterior pode ajudar: stackoverflow.com/questions/2572582/…
parent5446

6
Às vezes, o ipython --pylabinterpretador python (ex: with ) é iniciado com os módulos predefinidos carregados. Restos pergunta, pois como saber o alias usado o_O
Yota

Respostas:


182
import sys
sys.modules.keys()

Uma aproximação de obter todas as importações apenas para o módulo atual seria inspecionar os globals()módulos:

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

Isso não retornará importações locais, ou importações que não sejam de módulo, como from x import y. Observe que isso retorna val.__name__para que você obtenha o nome do módulo original, se você usou import module as alias; em vez disso, se desejar o alias.


2
Ou você pode encontrar a interseção de sys.modules com globals e não fazer nenhum tipo de teste.
Marcin

Essa é a única solução que retorna o nome completo do módulo quando você redefine o nome do seu módulo importado. Por exemplo, se você fizer import numpy as npisso, isso retornará numpyenquanto as outras duas sugestões retornarão np.
Joelostblom

1
Se, por algum motivo, você precisar do nome do módulo e do alias, isso estará disponível na namevariável Assim, para gerar a string, import numpy as npfaça algo como 'import %s as %s' % (val.__name__, name)onde a declaração de rendimento está agora.
André C. Andersen

38

Encontre a interseção de sys.modulescom globals:

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

1
Talvez use um frozensetaqui em vez disso? - Aqui está o meu liner:frozenset(imap(lambda name: modules[name], frozenset(modules) & frozenset(globals())))
AT

A solução acima não extrai os módulos que estão sendo importados usando o fromcomando Por exemplo, considere from scipy.stats import norm. Isso não me diz que o normmódulo é importado. Como isso pode ser incorporado a isso?
Ujjwal

@Ujjwal Bem, esses módulos não estão sendo importados, apenas seus componentes. Se você precisar de tudo, use sys.modules.
Marcin

28

Se você quiser fazer isso de fora do 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)

Isso imprimirá todos os módulos carregados pelo myscript.py.


1
Para Python 3, a mudança .iteritems()para .items()e suportes para a instrução de impressão
cardamomo

Nota: Falha ao lidar com o espaço para nome: bugs.python.org/issue40350
mPrinC

Este recorte em si tem 204 dependências na minha máquina ... Isso é estranho ou esperado?
Guimoute

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

8

digamos que você importou matemática e re:

>>import math,re

agora para ver o mesmo uso

>>print(dir())

Se você executá-lo antes e depois da importação, é possível ver a diferença.


6

Na verdade, está funcionando muito bem com:

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

Isso criará uma lista com nomes de módulos importáveis .


Isso realmente não responde à pergunta.
bergercookie

4

Este código lista os módulos importados pelo seu módulo:

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]

Deve ser útil se você quiser saber quais módulos externos instalar em um novo sistema para executar seu código, sem a necessidade de tentar novamente.

Não listará o sysmódulo ou os módulos importados dele.


1

Roubando do @Lila (não foi possível fazer um comentário devido à falta de formatação), isso também mostra o / path / do módulo:

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

que produz:

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

.. adequado para grepping ou o que você tem. Esteja avisado, é longo!


0

Eu gosto de usar uma compreensão de lista neste 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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.