Как перечислить импортированные модули?

Как перечислить все импортированные модули?

Например. Я хотел бы получить ['os', 'sys'] из этого кода:

import os
import sys

Ответ 1

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 as alias; введите имя вместо этого, если вы хотите использовать псевдоним.

Ответ 2

Найдите пересечение sys.modules с globals:

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

Ответ 3

Если вы хотите сделать это вне скрипта:

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.

Ответ 4

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

Ответ 5

скажем, вы импортировали математику и повторно:

>>import math,re

Теперь, чтобы увидеть то же самое использование

>>print(dir())

Если вы запустите его до импорта и после импорта, вы увидите разницу.

Ответ 6

На самом деле он неплохо работает:

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

Это создаст список с именами импортируемых модулей.

Ответ 7

В этом коде перечислены модули, импортированные вашим модулем:

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 или модули, импортированные из него.

Ответ 8

Кража из @Lila (не удалось сделать комментарий из-за отсутствия форматирования), здесь также показан модуль/путь/:

#!/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 different from @Lila script
finder.report()

который производит:

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

.. подходит для grepping или что у тебя. Будьте осторожны, это долго!

Ответ 9

Мне нравится использовать понимание списка в этом случае:

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