如何枚举所有导入的模块?

例如,我想从下面的代码中获取['os', 'sys']:

import os
import sys

当前回答

找到sys的交点。带全局变量的模块:

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

其他回答

假设你已经导入了math和re:

>>import math,re

现在来看看同样的用法

>>print(dir())

如果在导入之前和导入之后运行它,可以看到区别。

import sys
sys.modules.keys()

只获取当前模块的所有导入的近似方法是检查模块的globals():

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

它不会返回本地导入,也不会返回像from x import y这样的非模块导入。请注意,它返回val.__name__,因此如果你使用import module作为别名,你会得到原始的模块名;如果需要别名,则生成名称。

找到sys的交点。带全局变量的模块:

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

在这种情况下,我喜欢使用列表理解:

>>> [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)

如果你想在脚本之外做这个:

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)

这将打印myscript.py加载的所有模块。