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


152

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

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

import os
import sys

Я не думаю, что это возможно в родном 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]

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.


1
Для Python 3 измените .iteritems()на .items()и скобки для оператора print
cardamom

Примечание. Сбой при работе с пространством имен: bugs.python.org/issue40350
mPrinC

Этот отрывок сам по себе имеет 204 зависимости от моей машины ... Это странно или ожидаемо?
Гимут


8

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

>>import math,re

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

>>print(dir())

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


6

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

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

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


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


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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.