关于python:如何列出导入的模块?

How to list imported modules?

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

例如,我想从该代码中获取的['os'、'sys']

1
2
import os
import sys


1
2
import sys
sys.modules.keys()

仅为当前模块获取所有导入的近似值是检查globals()中的模块:

1
2
3
4
5
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 as alias,则会得到原始的模块名;如果需要别名,则返回yield name。


找到sys.modulesglobals的交点:

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


如果要从脚本外部执行此操作:

Python 2

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

Python 3

1
2
3
4
5
from modulefinder import ModuleFinder
finder = ModuleFinder()
finder.run_script("myscript.py")
for name, mod in finder.modules.items():
    print(name)

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


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

假设您已经导入了数学,并重新:

1
>>import math,re

现在来看同样的用法

1
>>print(dir())

如果在导入之前和导入之后运行它,就可以看到不同之处。


它实际上非常适合:

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

这将创建一个具有可导入模块名称的列表。


此代码列出模块导入的模块:

1
2
3
4
5
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]

如果您想知道在新系统上安装哪些外部模块来运行代码,而不需要一次又一次地尝试,那么它应该很有用。

它不会列出从中导入的sys模块。


从@lila窃取(由于没有格式化,无法发表评论),这也显示了模块的/path/:

1
2
3
4
5
6
7
8
#!/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()

产生:

1
2
3
4
5
6
7
8
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
...

…适合大胸或其他有你的。被警告了,太长了!


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

1
2
3
4
5
6
7
8
9
10
11
>>> [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)