Я реализую крючок импорта, который автоматически устанавливает недостающие модули с помощью pip.Получение полного имени модуля в Import hook
Пока он работает нормально с простыми модулями (которые имеют только один уровень), например unipath
. Однако, если я попытаюсь использовать его с многоуровневым импортом, например zope.interface
, импортер получает только первую часть (zope
). Это приводит к сбою, поскольку в PyPI не существует zope
.
Любая идея о том, как добиться получения полного имени модуля при импорте?
Вот некоторый код:
class PipLoader(object):
def __init__(self):
self.module = None
def find_module(self, name, path):
print "Will install module {}".format(name)
self.module = None
sys.meta_path.remove(self)
try:
pip_install(name)
self.module = importlib.import_module(name)
finally:
sys.meta_path.append(self)
return self
def load_module(self, name):
if not self.module:
raise ImportError("Unable to load module")
module = self.module
sys.modules[name] = module
return module
def install():
sys.meta_path.append(PipLoader())
Ouch, ужасная идея. Не устанавливайте автоматически; что, если есть версии несовместимости? –
Не беспокойтесь @MartijnPieters! Уверяю вас, что остальная часть приложения намного опаснее: P Это просто для удовольствия. –
Если вы замените '__import__', тогда вы получите глобальные модули модуля импорта модуля и гораздо больше информации. – User