Как перечислить все импортированные модули?
Например, я хотел бы получить ['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
; Вместо этого укажите имя, если вы хотите использовать псевдоним.
import numpy as np
, он вернется, numpy
а два других предложения вернутся np
.
name
переменной. Таким образом, для генерации строки import numpy as np
сделайте что-то вроде того, 'import %s as %s' % (val.__name__, name)
где сейчас находится оператор yield.
Найдите пересечение sys.modules
с globals
:
import sys
modulenames = set(sys.modules) & set(globals())
allmodules = [sys.modules[name] for name in modulenames]
frozenset
здесь вместо этого? - Вот мой 1-вкладыш:frozenset(imap(lambda name: modules[name], frozenset(modules) & frozenset(globals())))
from
команды. Например, рассмотрим from scipy.stats import norm
. Это не говорит мне, что norm
модуль импортирован. Как это может быть включено в это?
Если вы хотите сделать это вне скрипта:
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.
.iteritems()
на .items()
и скобки для оператора print
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 (не удалось сделать комментарий из-за отсутствия форматирования), здесь также показан модуль / 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 или что у тебя. Будьте осторожны, это долго!
Мне нравится использовать понимание списка в этом случае:
>>> [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)
ipython --pylab
) интерпретатор Python запускается с загруженными предопределенными модулями. Остается вопрос, как узнать используемый псевдоним o_O