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

152

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

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

import os
import sys
alex2k8
источник
Я не думаю, что это возможно в родном Python, но этот предыдущий вопрос может помочь: stackoverflow.com/questions/2572582/…
parent5446
6
Иногда (например, с ipython --pylab) интерпретатор Python запускается с загруженными предопределенными модулями. Остается вопрос, как узнать используемый псевдоним o_O
yota

Ответы:

182
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 с глобальными переменными и вообще не проводить тестирование типов.
Марчин
Это единственное решение, которое возвращает полное имя модуля, когда вы переопределяете имя вашего импортированного модуля. Например, если вы это сделаете import numpy as np, он вернется, numpyа два других предложения вернутся np.
joelostblom
1
Если по какой-то причине вам нужно имя модуля и псевдоним, это доступно в nameпеременной. Таким образом, для генерации строки import numpy as npсделайте что-то вроде того, 'import %s as %s' % (val.__name__, name)где сейчас находится оператор yield.
Андре С. Андерсен
38

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

import sys
modulenames = set(sys.modules) & set(globals())
allmodules = [sys.modules[name] for name in modulenames]
Marcin
источник
1
Может быть, использовать frozensetздесь вместо этого? - Вот мой 1-вкладыш:frozenset(imap(lambda name: modules[name], frozenset(modules) & frozenset(globals())))
AT
Приведенное выше решение не извлекает модули, которые импортируются с помощью fromкоманды. Например, рассмотрим from scipy.stats import norm. Это не говорит мне, что normмодуль импортирован. Как это может быть включено в это?
Уджвал
@Ujjwal Ну, эти модули не импортируются, только их компоненты. Если вам нужно все, просто используйте sys.modules.
Марчин
28

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

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.

Lila
источник
1
Для Python 3 измените .iteritems()на .items()и скобки для оператора print
cardamom
Примечание. Сбой при работе с пространством имен: bugs.python.org/issue40350
mPrinC
Этот отрывок сам по себе имеет 204 зависимости от моей машины ... Это странно или ожидаемо?
Гимут
12
print [key for key in locals().keys()
       if isinstance(locals()[key], type(sys)) and not key.startswith('__')]
Майк Аксиак
источник
8

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

>>import math,re

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

>>print(dir())

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

Мукундха Редди
источник
6

Это на самом деле работает довольно хорошо с:

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

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

fabiand
источник
Это на самом деле не отвечает на вопрос.
bergercookie
4

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

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

Охад Коэн
источник
1

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

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

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

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 или что у тебя. Будьте осторожны, это долго!

JDonner
источник
0

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

>>> [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)
Dex
источник