Як перелічити імпортні модулі?


152

Як перерахувати всі імпортовані модулі?

Наприклад, я хотів би отримати ['os', 'sys']цей код:

import os
import sys

Я не думаю , що це можливо в рідній Python, але попередній питання може допомогти: stackoverflow.com/questions/2572582 / ...
parent5446

6
Іноді (наприклад: з ipython --pylab) інтерпретатор python запускається із заздалегідь завантаженими модулями. Залишається питання, як дізнатися псевдонім, який використовував o_O
йота

Відповіді:


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)де зараз є заява про врожайність.
Андре К. Андерсен

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

@Ujjwal Ну, ці модулі не імпортуються, а лише їх компоненти. Якщо вам все потрібно, просто використовуйте sys.modules.
Марцін

28

Якщо ви хочете зробити це за межами сценарію:

Пітон 2

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

Пітон 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()і дужки для оператора друку
кардамон

Примітка. Виходить з ладу під час роботи з простором імен: 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 (не вдалося коментувати через відсутність форматування), це також показує модуль / шлях /, а також:

#!/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
...

.. підходить для греппінгу чи що у вас є. Попереджайте, це довго!


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.