Иногда (например, с 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; Вместо этого укажите имя, если вы хотите использовать псевдоним.
Или вы можете найти пересечение 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]
Может быть, использовать 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 importModuleFinder
finder =ModuleFinder()
finder.run_script("myscript.py")for name, mod in finder.modules.iteritems():print name
Python 3
from modulefinder importModuleFinder
finder =ModuleFinder()
finder.run_script("myscript.py")for name, mod in finder.modules.items():print(name)
Это напечатает все модули, загруженные myscript.py.
В этом коде перечислены модули, импортированные вашим модулем:
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 ifnot m in before]
Это может быть полезно, если вы хотите знать, какие внешние модули установить в новой системе для запуска вашего кода, без необходимости пробовать снова и снова.
Он не будет перечислять sysмодуль или модули, импортированные из него.
Кража из @Lila (не удалось сделать комментарий из-за отсутствия форматирования), здесь также показан модуль / path /:
#!/usr/bin/env pythonimport sys
from modulefinder importModuleFinder
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()
который производит:
NameFile--------...
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Ответы:
Примером получения всего импорта только для текущего модуля будет проверка
globals()
модулей:Это не вернет локальный или немодульный импорт
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
:источник
frozenset
здесь вместо этого? - Вот мой 1-вкладыш:frozenset(imap(lambda name: modules[name], frozenset(modules) & frozenset(globals())))
from
команды. Например, рассмотримfrom scipy.stats import norm
. Это не говорит мне, чтоnorm
модуль импортирован. Как это может быть включено в это?Если вы хотите сделать это вне скрипта:
Python 2
Python 3
Это напечатает все модули, загруженные myscript.py.
источник
.iteritems()
на.items()
и скобки для оператора printисточник
скажем, вы импортировали математику и повторно:
Теперь, чтобы увидеть то же самое использование
Если вы запустите его до импорта и после импорта, вы увидите разницу.
источник
Это на самом деле работает довольно хорошо с:
Это создаст список с импортируемыми именами модулей.
источник
В этом коде перечислены модули, импортированные вашим модулем:
Это может быть полезно, если вы хотите знать, какие внешние модули установить в новой системе для запуска вашего кода, без необходимости пробовать снова и снова.
Он не будет перечислять
sys
модуль или модули, импортированные из него.источник
Кража из @Lila (не удалось сделать комментарий из-за отсутствия форматирования), здесь также показан модуль / path /:
который производит:
.. подходит для grepping или что у тебя. Будьте осторожны, это долго!
источник
Мне нравится использовать понимание списка в этом случае:
источник