Как перечислить все импортированные модули?
Например. Я хотел бы получить ['os', 'sys']
из этого кода:
import os
import sys
Как перечислить все импортированные модули?
Например. Я хотел бы получить ['os', 'sys']
из этого кода:
import os
import sys
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
; введите имя вместо этого, если вы хотите использовать псевдоним.
Найдите пересечение sys.modules
с globals
:
import sys
modulenames = set(sys.modules) & set(globals())
allmodules = [sys.modules[name] for name in modulenames]
Если вы хотите сделать это вне скрипта:
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.
print [key for key in locals().keys()
if isinstance(locals()[key], type(sys)) and not key.startswith('__')]
скажем, вы импортировали математику и повторно:
>>import math,re
Теперь, чтобы увидеть то же самое использование
>>print(dir())
Если вы запустите его до импорта и после импорта, вы увидите разницу.
На самом деле он неплохо работает:
import sys
mods = [m.__name__ for m in sys.modules.values() if m]
Это создаст список с именами импортируемых модулей.
В этом коде перечислены модули, импортированные вашим модулем:
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 (не удалось сделать комментарий из-за отсутствия форматирования), здесь также показан модуль/путь/:
#!/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 или что у тебя. Будьте осторожны, это долго!
Мне нравится использовать понимание списка в этом случае:
>>> [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)